当前位置: 首页 > news >正文

Spring6学习及复习笔记

1、快速入门认识

通过编写xml配置文件来创建对象,读取bean标签的id值和class值来创建。

之后再通过对象调用相关的方法(这里实际上用到的是反射机制)

对象会存放到Map集合中

大致反射思路如下:(这里只是模拟,并非真的就这几行实现)

 2、整合log4j2日志框架

引入依赖,创建配置文件log4j2.xml    这样便可自动生成日志

手动写日志:
Logger logger=LoggerFactory.getLogger(testUser.class);
logger.info("手动写日志成功了");

 3、IOC

一、IOC容器

IOC即为控制反转,使用IOC容器管理bean对象,设计出更加松耦合的程序

用它来管理对象的实例化和初始化,以及对象间的依赖关系。

对象用Map集合存放

DI,即为依赖注入,实现了控制反转这一思想

一般使用set或构造注入

二、XML管理bean

1、获取bean

<bean  id="user" class="com.iocxml.User"></bean>

ApplicationContext context=new ClassPathXmlApplicationContext(bean.xml);

User user1=(User)context.getBean("user");//根据id获取bean

User user2=(User)context.getBean(User.class);//根据类型获取bean

User user3=(User)context.getBean("user",User.class);//根据id和类型获取bean

注意,获取时指定类型bean只能有一个,如果同一个类有多个bean会报错。

一般都只根据id获取,确保每个bean的id不一样 

这里还可以配置接口的实现类,然后获取对象时通过接口的类名来获取,但实现类必须唯一。

2、setter注入

确保属性有set方法和构造方法

//set注入

<bean id="book"  class="com.book">

<property name="name"  value="图书名称"></property>  

<property name="author"  value="图书作者"></property>

</bean>  

//构造器注入

<bean id="book1"  class="com.book">

<constructor-arg  name="name"   value="图书名称"></constructor-arg>

<constructor-arg  name="author"   value="图书作者"></constructor-arg>

</bean>  

特殊值处理 

  1. 字面量赋值。String  a="33a"
  2. null。    使用标签<null/>
  3. xml实体。     对字符转义   <  :&lt     >:&gt
  4. CDATA节       用来写特殊符号
3、对象类型赋值

//引入外部bean

<bean id="dept"   class="com.dept">

<property  name="dname"   value="部门属性"></property>

</bean>

<bean id="emp"   class="com.emp">

<property name="ename"  value="员工名字"></property>  

<property name="age"  value="50"></property>

<property name="dept"  ref="dept"></property>

</bean>

 //内部bean

<bean id="emp2"   class="com.emp">

<property name="ename"  value="员工名字"></property>  

<property name="age"  value="50"></property>

   <property name="dept" >     

           <bean id="dept2"   class="com.dept">

                <property  name="dname"   value="部门属性"></property>

            </bean>

    </property>

</bean>

 //级联属性赋值(少用)

<bean id="dept3"   class="com.dept">

</bean>        

<bean id="emp3"   class="com.emp">

<property name="ename"  value="员工名字"></property>  

<property name="age"  value="50"></property>

<property name="dept"  ref="dept"></property>

<property  name="dept.dname"   value="部门属性"></property>

</bean>

4、数组类型属性注入

<bean id="dept"   class="com.dept">

<property  name="dname"   value="部门属性"></property>

</bean>

<bean id="emp"   class="com.emp">

<property name="ename"  value="员工名字"></property>  

<property name="age"  value="50"></property>

<property name="dept"  ref="dept"></property>

<property name="hobby"  >

     <array>

     <value>抽烟</value>

    <value>喝酒</value>

     <value>烫头</value>

     </array>

</property>

</bean>

5、集合类型属性注入

 List集合属性注入

<bean id="dept"   class="com.dept">

<property  name="dname"   value="部门属性"></property>

<property  name="empList">

     <list>

       <ref  bean="emp2"></ref>

      </list>

</property>

</bean>

Map集合属性注入 

<bean id="dept"   class="com.dept">

<property  name="dname"   value="部门属性"></property>

<property  name="empMap">

     <map>

       <entry>

         <key>

            <value>1</value>

          </key>

         <ref bean="emp2"></ref>

       </entry>

   </map>

</property>

</bean>

引用集合类型的bean,使用util

 <property  name="empList"  ref="empList"></property>

<util:list  id=empList>

     //里面写集合

       <ref  bean="emp2"></ref>

</util:list>

6、引入外部属性文件

引用依赖,再创建properties文件。

7、bean的作用域

8、bean的生命周期

 

<bean  id="user"  class="com.User"  init-method="initMethod"  destory-method="destoryMethod">

<property  name="name"   value="名字"></property> 

</bean>

销毁用context.close()

//后置处理器使用,要实现BeanPostProcess接口 

9、FactoryBean

 ​​​​​​配置MyFactoryBean会生成User对象

 10、自动注入

三、注解管理bean

1、注解初识

不提供value默认找首字母小写的同类名id

2、Autowired

默认根据类型匹配

@AutoWired                    //属性注入

private    Service   service;

@Autowired                   //set方法注入

public  void setUserController(UserService   userservice) 

{   this.userservice=userservice;}

 @Autowired                   //构造方法注入

public  UserController(UserService   userservice) 

{   this.userservice=userservice;}

                //形参注入

public  UserController( @Autowired   UserService   userservice) 

{   this.userservice=userservice;}

 @AutoWired               

@Qualifier(value="userServiceFirst")        //联合使用,根据名称进行注入

private    Service   service;

3、Resource

 

4、全注解开发

使用配置类来替代配置文件

 四、手写IOC

1、Java反射

Car类

package reflect;public class Car {private String name;private int age;private String color;private void run(){System.out.println("私有方法run......");}public Car() {}public Car(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}
}

TestCar,获取类并实例化对象

package reflect;import org.junit.Test;public class TestCar {//获取class对象的三种方式@Testpublic void test1() throws Exception {//方式一:调用运行时类的属性.classClass carClass = Car.class;System.out.println(carClass);//方式二:通过运行时类的对象,调用getClass()Class carClass1 = new Car().getClass();System.out.println(carClass1);//方式三:调用Class的静态方法:forName(String classPath)Class carClass2 = Class.forName("reflect.Car");System.out.println(carClass2);//实例化Car car=(Car)carClass.getDeclaredConstructor().newInstance();System.out.println(car);}
}

获取构造方法,并设置对象参数

@Testpublic void test2() throws Exception {Class carClass = Car.class;//获取所有构造方法包括private修饰的Constructor[] constructors=carClass.getDeclaredConstructors();for(Constructor constructor:constructors){System.out.println(constructor);}//    获取指定的构造方法Constructor constructor=carClass.getDeclaredConstructor(    String.class,int.class,String.class);constructor.setAccessible(true);//解除私有限定Car car=(Car)constructor.newInstance("宝马",10,"红色");System.out.println(car);}

获取属性并设置

@Testpublic void test3() throws Exception {//获取所有属性包括private修饰的Class carClass = Car.class;Car car=(Car)carClass.getDeclaredConstructor().newInstance();Field[]  fields=carClass.getDeclaredFields();for(Field field:fields){if(field.getName().equals("name")){field.setAccessible(true);//解除私有限定field.set(car,"奔驰");}//  System.out.println(field);System.out.println(car);}}

获取方法得到返回值

@Testpublic void test4() throws Exception {Car car=new Car("奔驰",10,"红色");Class carClass = car.getClass();Method[] methods=carClass.getDeclaredMethods();for(Method method:methods){if(method.getName().equals("run")){method.setAccessible(true);//解除私有限定method.invoke(car);}else if(method.getName().equals("toString")){method.setAccessible(true);//解除私有限定String str=(String)method.invoke(car);System.out.println(str);}}}
2、手写IOC

创建两个注解,bean和di,分别用于创建对象和注入属性

package com.anno;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Bean {
}
package com.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Di {
}

实现AnnotationApplicationContext

package com.bean;public interface ApplicationContext {Object getBean(Class clazz);
}
package com.bean;import com.anno.Bean;import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;public class AnnotationApplicationContext implements ApplicationContext {private  Map<Class,Object> beanMap = new HashMap<>();private  String rootpath;@Overridepublic Object getBean(Class clazz) {return beanMap.get(clazz);}public AnnotationApplicationContext(String basepackage){//把包名转化为路径名String packagepath= basepackage.replaceAll("\\.","\\\\");try {//获取当前线程的类加载器,然后获取所有资源的路径Enumeration<URL> urls=Thread.currentThread().getContextClassLoader().getResources(packagepath);//遍历路径while (urls.hasMoreElements()){//获取路径URL url=urls.nextElement();//解码String FilePath= URLDecoder.decode(url.getFile(),"UTF-8");//获取项目的根路径rootpath=FilePath.substring(0,FilePath.length()-packagepath.length());//加载beanloadBean(new File(FilePath));}}catch (Exception e){e.printStackTrace();}}private void loadBean(File file) throws Exception {//如果是文件夹,就进入文件夹if(file.isDirectory()){//获取文件夹下的所有文件File[] files=file.listFiles();//如果文件夹下没有文件,就返回if(files==null||files.length==0){return;}//遍历文件夹下的所有文件for (File child:files){//如果是文件夹,就递归进入文件夹加载if(child.isDirectory())loadBean(child);else {//如果是文件,就加载bean//获取类的路径String pathwithclass=child.getAbsolutePath().substring(rootpath.length()-1);//如果是class文件,就加载beanif(pathwithclass.contains(".class")){//把路径转化为包名String allname=pathwithclass.replaceAll("\\\\",".").replace(".class","");Class<?> clazz=Class.forName(allname);//不是接口if(!clazz.isInterface()){Bean annotation=clazz.getAnnotation(Bean.class);//是beanif(annotation!=null){Object instance =clazz.getConstructor().newInstance();//是否实现了接口if(clazz.getInterfaces().length>0){beanMap.put(clazz.getInterfaces()[0],instance);}else {beanMap.put(clazz,instance);}}}}}}}}
}

实现service和dao的实现类

package com.dao;import com.anno.Bean;@Bean
public class UserDaoImpl implements UserDao {@Overridepublic void add() {System.out.println("UserDaoImpl add");}}
package com.service;import com.anno.Bean;
import com.anno.Di;
import com.dao.UserDao;@Bean
public class UserServiceImpl implements UserService{@Diprivate UserDao userDao;@Overridepublic void add() {System.out.println("userservice add");}
}

测试:

package com;import com.bean.AnnotationApplicationContext;
import com.bean.ApplicationContext;
import com.service.UserService;import java.net.URL;
import java.util.Enumeration;public class Main {public static void main(String[] args) {ApplicationContext context=new AnnotationApplicationContext("com");UserService userService=(UserService)context.getBean(UserService.class);System.out.println(userService);userService.add();}
}

修改AnnotationApplicationContext代码,增加属性注入 。getbean里增加loadDi()

 private void loadDi(){//遍历beanMapfor (Map.Entry<Class,Object> entry:beanMap.entrySet()){//获取bean的所有属性Object obj=entry.getValue();//获取对象ClassClass<?> clazz=obj.getClass();//获取对象的所有属性Field[] fields=clazz.getDeclaredFields();//遍历属性for (Field field:fields){//判断属性是否有Di注解Di annotation=field.getAnnotation(Di.class);if(annotation!=null){field.setAccessible(true);//如果有Di注解,就注入属性try {field.set(obj,beanMap.get(field.getType()));} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}}}

测试

4、AOP 

一、代理模式

核心代码与日志代码在一起不合理,不利于维护。所以使用代理模式

1、静态代理

再写一个接口的实现类,定义一个核心实现类的对象作为属性,然后同样的方法中去调用,前后增加自己的代码。

但是代码写死了没有具备灵活性。

2、动态代理

public Object getProxy(){//得到类加载器ClassLoader classloader=target.getClasss().getClassLoader();//目标对象实现接口的数组形式Class<?> interfaces=target.getClass().getInterfaces();//设置实现目标方法的过程InvocationHandler invocationhandler= new InvocationHandler(){public Object invoke(Object proxy,Method method,Object[] args)  throws Throwable{
//代理对象、需要重写的方法,方法里面的参数System.out.println("动态代理日志1");Object  result=method.invoke(target,args);System.out.println("动态代理日志2");return result;}};return Proxy.newProxyInstance(classloader,interfaces,invocationhandler);} 

 二、概念

面向切面编程,通过预编译和运行期间动态代理方式实现,在不改变原代码的情况下,给程序动态统一添加额外功能的一种技术。

  1. 横切关注点:各个模块解决同一个问题。如事务、日志都属于横切关注点
  2. 通知:想要增强的功能,比如事务、日志,所实现的方法叫通知方法
  3. 切面:封装通知方法的类。
  4. 目标:目标对象
  5. 代理:代理对象
  6. 连接点:spring允许你使用通知的位置
  7. 切入点:定位连接点的方式

三、注解实现AOP

 

 

切入点表达式:

JoinPoint获得切入点信息

 

切面的优先级用@Order实现

四、xml实现AOP

<aop:config>

  <aop:aspect  ref="logAspect">

    <aop:pointcut  id="pointcut"  expression="execution(* com.*((..))"/>

    <aop:before  method:"beforemethod"  pointcut-ref="pointcut"></aop:before>

  </aop:aspect>

</aop:config> 

相关文章:

Spring6学习及复习笔记

1、快速入门认识 通过编写xml配置文件来创建对象&#xff0c;读取bean标签的id值和class值来创建。 之后再通过对象调用相关的方法&#xff08;这里实际上用到的是反射机制&#xff09; 对象会存放到Map集合中 大致反射思路如下&#xff1a;&#xff08;这里只是模拟&#x…...

开源语音-文本基础模型和全双工语音对话框架 Moshi 介绍

介绍 一、项目背景 Moshi是一种语音-文本基础模型和全双工语音对话框架。它使用了Mimi这一业界领先的流式神经音频编解码器。Mimi能够以完全流式处理的方式&#xff08;80毫秒的延迟&#xff0c;即帧大小&#xff09;&#xff0c;将24千赫兹的音频信号压缩为12.5赫兹的表示形式…...

MATLAB学习笔记(六):MATLAB数学建模

MATLAB 是数学建模的强大工具&#xff0c;其丰富的函数库和可视化能力可以高效解决各类数学建模问题。以下是 MATLAB 数学建模的完整指南&#xff0c;涵盖建模流程、常用方法、代码示例及实际应用。 一、数学建模的基本流程 问题分析 • 明确目标&#xff08;预测、优化、分类等…...

博客打卡-求解流水线调度

题目如下&#xff1a; 有n个作业&#xff08;编号为1&#xff5e;n&#xff09;要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工&#xff0c;然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi&#xff08;1≤i≤n&#xff09;。 流水…...

【Ragflow】22.RagflowPlus(v0.3.0):用户会话管理/文件类型拓展/诸多优化更新

概述 在历经三周的阶段性开发后&#xff0c;RagflowPlus顺利完成既定计划&#xff0c;正式发布v0.3.0版本。 开源地址&#xff1a;https://github.com/zstar1003/ragflow-plus 新功能 1. 用户会话管理 在后台管理系统中&#xff0c;新增用户会话管理菜单。在此菜单中&…...

深度学习中ONNX格式的模型文件

一、模型部署的核心步骤 模型部署的完整流程通常分为以下阶段&#xff0c;用 “跨国旅行” 类比&#xff1a; 步骤类比解释技术细节1. 训练模型学会一门语言&#xff08;如中文&#xff09;用 PyTorch/TensorFlow 训练模型2. 导出为 ONNX翻译成国际通用语言&#xff08;如英语…...

【机器人】复现 WMNav 具身导航 | 将VLM集成到世界模型中

WMNav 是由VLM视觉语言模型驱动的&#xff0c;基于世界模型的对象目标导航框架。 设计一种预测环境状态的记忆策略&#xff0c;采用在线好奇心价值图来量化存储&#xff0c;目标在世界模型预测的各种场景中出现的可能性。 本文分享WMNav复现和模型推理的过程&#xff5e; 下…...

C++中析构函数不设为virtual导致内存泄漏示例

一、问题示例 #include <iostream> using namespace std;class Base { public:Base() { cout << "Base constructor\n"; }~Base() { cout << "Base destructor\n"; } // 不是 virtual };class Derived : public Base { public:Derived(…...

UDP--DDR--SFP,FPGA实现之模块梳理及AXI读写DDR读写上板测试

模块梳理介绍 在之前的几篇文章中&#xff0c;笔者详细介绍了整个项目的框架结构以及部分关键模块的实现细节。这些模块包括UDP协议栈、UDP指令监测、数据跨时钟域处理、DDR读写控制、内存读取控制以及DDR AXI控制器等。这些模块共同构成了项目的基础架构&#xff0c;每个模块…...

Slidev集成Chart.js:专业数据可视化演示文稿优化指南

引言&#xff1a;为何选择在Slidev中集成Chart.js&#xff1f; 在现代演示文稿中&#xff0c;高效的数据可视化对于清晰传达复杂信息至关重要。Slidev是一款灵活的开源演示文稿工具&#xff0c;基于Web技术构建&#xff0c;但在高级数据可视化方面存在一定局限。本文旨在提供一…...

动态规划(3)学习方法论:构建思维模型

引言 动态规划是算法领域中一个强大而优雅的解题方法,但对于许多学习者来说,它也是最难以掌握的算法范式之一。与贪心算法或分治法等直观的算法相比,动态规划往往需要更抽象的思维和更系统的学习方法。在前两篇文章中,我们介绍了动态规划的基础概念、原理以及问题建模与状…...

NDS3211HV单路H.264/HEVC/HD视频编码器

1产品概述 NDS3211HV单路高清编码器是一款功能强大的音/视频编码设备&#xff0c;支持2组立体声&#xff0c;同时还支持CC(CVBS)字幕。支持多种音频编码方式。该设备配备了多种音/视频输入接口&#xff1a;HD-SDI数字视频输入、HDMI高清输入&#xff08;支持CC&#xff09;、A…...

GO语言语法---if语句

文章目录 1. 基本语法1.1 单分支1.2 双分支1.3 多分支 2. Go特有的if语句特性2.1 条件前可以包含初始化语句2.2 条件表达式不需要括号2.3 必须使用大括号2.4 判断语句所在行数控制 Go语言的if语句用于条件判断&#xff0c;与其他C风格语言类似&#xff0c;但有一些独特的语法特…...

单细胞转录组(4)Cell Ranger

使用 Cell Ranger 分析单细胞数据 1. 数据转换 BCL2FASTQ 在进行单细胞数据分析之前&#xff0c;需要将 Illumina 测序仪生成的 BCL 格式数据转换为 FASTQ 格式。这一步通常使用 bcl2fastq 软件完成。 1.1 安装 bcl2fastq bcl2fastq 是 Illumina 提供的软件&#xff0c;用于…...

Python爬虫-爬取百度指数之人群兴趣分布数据,进行数据分析

前言 本文是该专栏的第56篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前的文章《Python爬虫-爬取百度指数之需求图谱近一年数据》中,笔者有详细介绍过爬取需求图谱的数据教程。 而本文,笔者将再以百度指数为例子,基于Python爬虫获取指定关键词的人群“兴…...

使用Python和Selenium打造一个全网页截图工具

无论是归档网站、测试页面设计&#xff0c;还是为报告记录网页内容&#xff0c;一个可靠的截图工具都能大大提升效率。本文将介绍如何使用Python、Selenium和wxPython构建一个用户友好的网页截图工具。该工具能在浏览器中显示网页&#xff0c;自动平滑滚动到底部以触发懒加载内…...

自动化脚本开发:Python调用云手机API实现TikTok批量内容发布

在2025年的技术生态下&#xff0c;通过Python实现TikTok批量内容发布的自动化脚本开发需结合云手机API调用、TikTok开放接口及智能调度算法。以下是基于最新技术实践的系统化开发方案&#xff1a; 一、云手机环境配置与API对接 云手机平台选择与API接入 推荐使用比特云手机或丁…...

React Hooks 必须在组件最顶层调用的原因解析

文章目录 前言一、Hooks 的基本概念二、Hooks 的调用规则三、为什么 Hooks 必须在最顶层调用&#xff1f;1. 维护 Hooks 的调用顺序2. 闭包与状态关联3. 实现细节&#xff1a;Hook 的链表结构 四、违反规则的后果五、如何正确使用 Hooks六、示例&#xff1a;正确与错误的用法对…...

西门子 Teamcenter13 Eclipse RCP 开发 1.2 工具栏 开关按钮

西门子 Teamcenter13 Eclipse RCP 开发 1.2 工具栏 开关按钮 1 配置文件2 插件控制3 命令框架 位置locationURI备注菜单栏menu:org.eclipse.ui.main.menu添加到传统菜单工具栏toolbar:org.eclipse.ui.main.toolbar添加到工具栏 style 值含义显示效果push普通按钮&#xff08;默…...

5.27本日总结

一、英语 复习list2list29 二、数学 学习14讲部分内容 三、408 学习计组1.2内容 四、总结 高数和计网明天结束当前章节&#xff0c;计网内容学完之后主要学习计组和操作系统 五、明日计划 英语&#xff1a;复习lsit3list28&#xff0c;完成07年第二篇阅读 数学&#…...

【持续更新中】架构面试知识学习总结

1.分库分表出现冗余数据&#xff1a; ☆分库分表方法&#xff1a;水平和垂直&#xff08;业务场景&#xff0c;数据关联性。逻辑要调查清楚&#xff09; 垂直&#xff1a;将一个表(库)按照列的业务相关性进行拆分&#xff0c;把经常一起使用的列放在一张表(库)&…...

文字溢出省略号显示

一、 单行文字溢出、省略号显示 二、 多行文字溢出&#xff0c;省略号显示 有较大的兼容性问题&#xff0c;适用于Webkit为内核的浏览器软件&#xff0c;或者移动端的&#xff08;大部分也是webkit&#xff09; 此效果建议后端人员开发 三、图片底侧空白缝隙的修复技巧&#…...

力扣-283-移动零

1.题目描述 2.题目链接 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 3.题目代码 class Solution {public void moveZeroes(int[] nums) {int dest-1;int cur0;while(cur<nums.length){if(nums[cur]0){cur;}else if(nums[cur]!0){swap(nums,cur,dest1);cur;dest…...

【001】RenPy打包安卓apk 流程源码级别分析

1. 入口在下图 2. SDK版本及代码入口 &#xff08;renpy-8.3.7-sdk&#xff09; 由于SDK一直在升级&#xff0c;本文采用 标题中的版本进行分析&#xff0c;整体逻辑变化不太大。 实际执行逻辑是调用的rapt 2.1 点击按钮实际执行逻辑 def AndroidIfState(state, needed, acti…...

机器学习-人与机器生数据的区分模型测试-数据处理 - 续

这里继续 机器学习-人与机器生数据的区分模型测试-数据处理1的内容 查看数据 中1的情况 #查看数据1的分布情况 one_ratio_list [] for col in data.columns:if col city or col target or col city2: # 跳过第一列continueelse:one_ratio data[col].mean() # 计算1值占…...

计算机视觉与深度学习 | Python实现EMD-VMD-LSTM时间序列预测(完整源码和数据)

EMD-VMD-LSTM 一、完整代码实现二、代码结构解析三、关键参数说明四、性能优化建议五、工业部署方案以下是用Python实现EMD-VMD-LSTM时间序列预测的完整代码,结合经验模态分解(EMD)、变分模态分解(VMD)与LSTM深度学习模型,适用于复杂非平稳信号的预测任务。代码包含数据生…...

数据结构与算法——双向链表

双向链表 定义链表分类双向链表&#xff1a;带头双向循环链表 初始化打印尾插头插尾删头删查找在pos(指定位置)之后插入结点在pos(指定位置)之前插入结点删除pos(指定位置)的结点销毁顺序表与链表的分析 定义 链表分类 单向和双向 带头和不带头 带头是指存在一个头结点&…...

.NET 中管理 Web API 文档的两种方式

前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性、可维护性和一致性的关键。今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式&#xff0c;希望可以帮助到有需要的同学。 Swashbuckle Swashbuckle.AspNetCore 是一个流行的 .NET 库&#xff0c;它使得在 AS…...

混合学习:Bagging与Boosting的深度解析与实践指南

引言 在机器学习的世界里&#xff0c;模型的性能优化一直是研究的核心问题。无论是分类任务还是回归任务&#xff0c;我们都希望模型能够在新的数据上表现出色&#xff0c;即具有良好的泛化能力。然而&#xff0c;实际应用中常常遇到模型过拟合&#xff08;高方差&#xff09;…...

基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作

基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作流程关键步骤&#xff1a; 1. 无人机航拍准备 • 设备检查&#xff1a;确保大疆 Mini 3 电量充足&#xff0c;相机设置为 RAW 格式&#xff08;便于后期调色&#xff09;&#xff0c;关闭自动白平衡。 • 飞行规划&…...

开源项目实战学习之YOLO11:12.1 ultralytics-models-sam-blocks.py源码

👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-__init__.py2.sam-modules-blocks.pybl…...

3D个人简历网站 5.天空、鸟、飞机

1.显示天空 models下新建文件Sky.jsx Sky.jsx // 从 React 库中导入 useRef 钩子&#xff0c;用于创建可变的 ref 对象 import { useRef } from "react"; // 从 react-three/drei 库中导入 useGLTF 钩子&#xff0c;用于加载 GLTF 格式的 3D 模型 import { useGLT…...

蓝桥杯-不完整的算式

问题描述 小蓝在黑板上写了一个形如 AopBCAopBC 的算式&#xff0c;其中 AA、BB、CC 都是非负整数&#xff0c;opop 是 、-、*、/、-、*、/&#xff08;整除&#xff09;四种运算之一。不过 AA、opop、BB、CC 这四部分有一部分被不小心的同学擦掉了。 给出这个不完整的算式&a…...

【Python 算法零基础 3.递推】

压抑与痛苦&#xff0c;那些辗转反侧的夜&#xff0c;终会让我们更加强大 —— 25.5.16 一、递推的概念 递推 —— 递推最通俗的理解就是数列&#xff0c;递推和数列的关系就好比 算法 和 数据结构 的关系&#xff0c;数列有点像数据结构中的线性表(可以是顺序表&#xff0c;也…...

计算机视觉与深度学习 | Matlab实现EMD-LSTM和LSTM时间序列预测对比(完整源码和数据)

EMD-LSTM与LSTM 一、数据生成与预处理二、经验模态分解(EMD)三、数据预处理四、模型构建与训练1. 单一LSTM模型2. EMD-LSTM混合模型五、预测与结果对比1. 单一LSTM预测2. EMD-LSTM预测3. 性能评估六、结果可视化七、完整代码说明八、典型输出结果九、改进方向以下是用MATLAB实…...

【爬虫】DrissionPage-6

官方文档: https://www.drissionpage.cn/browser_control/visit https://www.drissionpage.cn/browser_control/page_operation 1. Tab 对象概述 Tab 对象 是 DrissionPage 中用于控制浏览器标签页的主要单位。每个 Tab 对象对应一个浏览器标签页&#xff0c;负责执行各种网页…...

C/C++实践(十)C语言冒泡排序深度解析:发展历史、技术方法与应用场景

一、发展历史 冒泡排序&#xff08;Bubble Sort&#xff09;作为计算机科学领域最基础的排序算法之一&#xff0c;其历史可追溯至计算机编程的早期阶段。尽管具体起源时间难以考证&#xff0c;但它在20世纪50年代至60年代间被广泛讨论和应用。冒泡排序的名称来源于其独特的排序…...

git提交库常用词

新功能 feat修改BUG fix文档修改 docs格式修改 style重构 refactor性能提升 perf测试 test构建系统 build对CI配置文件修改 ci修改构建流程、或增加依赖库、工具 chore回滚版本 revert...

结构化思考力_第一章_明确理念打基础

接收信息的3个步骤 1. 梳理&#xff1a;观点、理由、事实和数据&#xff1b; 2. 画3这的结构图 3. 一句话概括 可套用固定格式。在——的基础上&#xff0c;从——、——、——N个方面&#xff0c;说明了————。 一句话概括主要内容的前提是&#xff0c;一定是结构非常…...

【C语言练习】046. 编写插入排序算法

046. 编写插入排序算法 046. 编写插入排序算法C语言实现插入排序代码说明示例运行输入:输出:插入排序的特点一、插入排序的适用场景二、C语言代码示例及分步讲解代码实现代码解析三、示例执行过程四、性能分析五、总结046. 编写插入排序算法 插入排序(Insertion Sort)是一…...

Kotlin与机器学习实战:Android端集成TensorFlow Lite全指南

本文将手把手教你如何在Android应用中集成TensorFlow Lite模型&#xff0c;实现端侧机器学习推理能力。我们以图像分类场景为例&#xff0c;提供可直接运行的完整代码示例。 环境准备 1. 开发环境要求 Android Studio Arctic Fox以上版本AGP 7.0Kotlin 1.6Minimum SDK 21 2.…...

【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)

一、nfs概念 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09; 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议&#xff0c;允许用户通过网络访问远程计算机上的文件&#xff0c;就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…...

Redis持久化机制详解:保障数据安全的关键策略

在现代应用开发中&#xff0c;Redis作为高性能的内存数据库被广泛使用。然而&#xff0c;内存的易失性特性使得持久化成为Redis设计中的关键环节。本文将全面剖析Redis的持久化机制&#xff0c;包括RDB、AOF以及混合持久化模式&#xff0c;帮助开发者根据业务需求选择最适合的持…...

经典算法 求C(N, K) % mod,保证mod是质数

求C(N, K) % mod&#xff0c;保证mod是质数 问题描述 给你三个整数N,K,mod保证mod是一个质数&#xff0c;求组合数C(N, K) % mod。 输入描述 输入有多组&#xff0c;输入第一行为两个整数T&#xff0c;mod。接下来2 - T 1行&#xff0c;每行输入N&#xff0c; K。 输出描…...

NY309NY318美光科技颗粒NY319NY320

NY309NY318美光科技颗粒NY319NY320 技术解析&#xff1a;架构创新与性能突围 美光科技的NY系列颗粒&#xff08;如NY309、NY318、NY319、NY320&#xff09;延续了其在存储技术领域的创新基因。以NY319为例&#xff0c;其采用16层BiCS3 3D NAND工艺&#xff0c;通过浮栅&#…...

Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)

概述 上一篇文章: Buildroot 移植MiniGUI, 在编译打包完文件系统后, 编写一个Demo进一步验证MiniGUI的功能. 目标平台: 键值CPUX2000架构mips内存128MB存储256MBLCD600*1024 MiniGUI 的三种运行模式 在编写第一个 MiniGUI 程序之前&#xff0c;需要了解如下事实&#xff1…...

flutter长列表 ListView、GridView、SingleChildScrollView、CustomScrollView区别

组件名称用途/适合场景是否懒加载支持列表结构用法复杂度SingleChildScrollView适用于内容数量不大、不重复的页面&#xff08;如表单、静态内容&#xff09;❌ 否❌ 否⭐⭐ListView适用于垂直方向的长列表&#xff0c;自动滚动&#xff1b;适合展示大量数据✅ 支持✅ 是⭐⭐Li…...

OpenCV透视变换

概念 OpenCV 透视变换是将图像从一个视平面投影到另一个视平面的过程&#xff0c;也叫投影映射 &#xff0c;属于空间立体三维变换。它基于透视原理&#xff0c;通过 33 的变换矩阵作用于图像像素坐标来实现映射转换 &#xff0c;能模拟人眼或相机镜头观看三维空间物体时的透视…...

Node.js 实战四:数据库集成最佳实践

你写了个登录接口&#xff0c;用上了 JWT&#xff1b;然后&#xff0c;产品来了句&#xff1a; “用户数据能分页查吗&#xff1f;能关联公司信息吗&#xff1f;我们这边还有多语言字段…” 你发现&#xff1a;SQL 写得越来越长&#xff0c;关联越来越绕&#xff0c;字段越来越…...

【JDBC】JDBC概述、历史版本及特征

1_JDBC概述 什么是JDBC JDBC&#xff08;Java DataBase Connectivity, Java数据库连接&#xff09; ,是一种用于执行SQL语句的Java API&#xff0c;为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成 有了JDBC&#xff0c;程序员只需用JDBC API写一个程序…...