SpringIoC和DI
文章目录
- OCP开闭原则
- DIP(依赖倒置原则)
- IOC(控制反转)
- 依赖注入DI
- 基于XML配置Bean
- set注入
- 构造注入
- 使用注解存储bean
- @Controller
- 方法注解@Bean
- 扫描路径
- 依赖注入
- 三种注入方式优缺点分析
引入
当我们写了一个程序,遵循SpringMVC三层架构,表现层调用业务逻辑层,业务逻辑层调用持久层,持久层返回数据给Dao层,最后返回到表现层,层与层之间接口,降低耦合度,我们通过new对象调用方法
如果我们需求改变就需要改动原来运行没问题的程序,如果是银行业务,涉及到钱的,后面需要对系统扩展,新增业务,需要改动,改完就需要测试,是很麻烦的事情,违背了OCP开闭原则和DIP原则
OCP开闭原则
OCP是软件七大开发原则中最基本的一个原则:开闭原则
开:对扩展开放
闭:对修改关闭
OCP是七大开发中最基本,最核心的,其他的六个原则都是为这个原则服务的
OCP的核心是什么?
只要在扩展系统功能时,没有修改以前写好的代码,那么就是符合OCP原则的
反之,进行系统功能扩展时,修改了之前的程序,之前所有的程序都需要进行改动,违背了OCP原则
DIP(依赖倒置原则)
像上面的图片
UserController依赖了具体的UserServiceImplForMySQL
UserServiceImplForMySQL依赖了具体的UserDaolmplForMySQL
目前来说:上是依赖下的。
凡是上依赖下的,都违背了依赖倒置原则。
举例子:造⼀辆车
传统的设计思路是先根据轮子大小设计底盘,根据底盘设计车身,再根据车身设计整个汽车
上依赖下,不符合依赖倒置原则,一旦需求发生变化,需要改动整个调用链上的所有代码
什么叫做符合依赖倒置原则?
上不再依赖下了,表示符合依赖倒置原则。
依赖倒置的原则的核心是什么?
倡导面向接口编程,面向抽象编程,不要面向具体编程。比如说new对象new了具体的实现类,我们希望的是存在接口类,而不需要具体的实现类,具体的是写死的
目的:降低程序的耦合度,提高扩展力
怎么解决上面的问题呢?
控制反转思想入场
IOC(控制反转)
什么是控制反转?
把对象创建的控制权交出去,把对象和对象之间的维护权交出去
通过这种思想,我们造车创建对象的顺序是以下这种方式
那么谁去管理呢?
Spring框架
Spring框架实现了控制反转IoC思想
Spring是一个实现了IoC思想的容器
依赖注入DI是控制反转思想的具体体现
Spring官方介绍
- Spring是一个轻量级的控制反转(loC)和面向切面(AOP)的容器框架。
- Spring最初的出现是为了解决EJB臃肿的设计,以及难以测试等问题。
- Spring为简化开发而生,让程序员只需关注核心业务的实现,尽可能的不再关注非业务逻辑代码(事务控制,安全日志等)。
Spring是怎么实例化对象的?
默认情况下,Spring会通过反射机制,调用类的无参构造方法来实例化对象
实现原理是
Class clazz = Class. forName(“//类路径”);
Object obj = clazz. newInstance();
Spring把创建好的Bean存储到什么数据结构中?
Map<String,Object>
Spring 会管理很多Bean对象,id里的是唯一表示,bean的id不能重复,class里的是类的路径,value对应的是存储的类的对象
SpringIoC的底层是怎么实现的?
ApplicationContext接口的超级父接口是:BeanFactory(翻译为Bean工厂,就是能够生产Bean对象的一个工厂对象)定义了获取Bean的方法,而具体的实现类如DefaultListableBeanFactory负责实际的创建过程。ApplicationContext在此基础上增加了更多的企业级功能,比如事件传播、资源访问等。
ApplicationContext是一次性加载并初始化所有的Bean对象,而BeanFactory是需要那个才去加载那个,因此更加轻量
BeanFactory是IoC容器的顶级接口。
Spring的IoC容器底层实际上使用了:工厂模式。
什么是工厂模式?
工厂模式是一种创建型设计模式,用于将对象的创建逻辑封装起来,客户端无需直接实例化具体对象,从而提高代码的灵活性和降低了代码的耦合度
Spring底层的IoC是怎么实现的?
总结:XML解析 +工厂模式 +反射机制
依赖注入DI
注入的常见两种方式
- set注入:执行set方法给属性赋值
- 构造方法注入:执行构造方法给属性赋值
对于依赖注入的理解:对象A和对象B之间的关系,通过注入的手段来维护
基于XML配置Bean
set注入
必须提供一个set方法。
添加依赖
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.2.3</version></dependency><!-- Junit依赖单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.19.0</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j2-impl</artifactId><version>2.19.0</version></dependency>
</dependencies>
配置XML文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
定义类
package service;
import dao.UserDao;public class UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void printUser(){userDao.print();}
}
Spring容器会调用这个set方法,来给userDao属性赋值。
自己写一个set方法,不使用IDEA工具生成的。不符合javabean规范。
命名规范:使用IDEA生成的setter方法
package impl;import dao.UserDao;public class UserDaoImpl implements UserDao {@Overridepublic void print() {System.out.println("打印UserDaoImpl的信息");}
}
package dao;public interface UserDao {void print();
}
xml配置Bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--定义userDao--><bean id="userDao" class="impl.UserDaoImpl"/><!--定义userService--><bean id="userService" class="service.UserService"><property name="userDao" ref="userDao"/></bean>
</beans>
bean标签的两个重要属性:
id:是这个bean的身份证号,不能重复,是唯一的标识。
class:必须填写类的全路径,全限定类名。 (带包名的类名)
想让Spring调用对应的set方法,需要配置property标签
property标签 :Setter方法注入,支持简单类型或引用类型
name属性怎么指定?去掉set,把剩下的单词首字母变小写
ref为引用,ref后面指定的是要注入的bean的id
Test类
public class UserDaoTest {@Testpublic void test(){ApplicationContext context=new ClassPathXmlApplicationContext("userDao.xml");UserService userService = context.getBean("userService", UserService.class);userService.printUser();}
}
ApplicationContext 为应用上下文—Spring容器。
ApplicationContext 是一个接口。
ApplicationContext 接口下有很多实现类。其中有一个实现类叫做:ClassPathXmlApplicationContext
ClassPathXmLApplicationContext 专门从类路径当中加载spring配置文件的一个Spring上下文对象。
ApplicationContext context=new ClassPathXmlApplicationContext(“userDao.xml”);
这行代码只要执行:就相当于启动了Spring容器,解析userDao. xml文件,并且实例化所有的bean对象,放到spring容器当中。
输出信息
构造注入
提供构造方法
public class UserService {private UserDao userDao;public UserService() {}public UserService(UserDao userDao) {this.userDao = userDao;}public void printUser(){userDao.print();}
}
xml配置
<bean id="userService" class="service.UserService"><constructor-arg index="0" ref="userDao"/></bean>
constructor-arg标签注入依赖 ref指定要注入的bean的id
当构造方法有多个参数,可以使用index下标
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--定义userDao--><bean id="userDao" class="impl.UserDaoImpl"/><!--定义bookDao--><bean id="bookDao" class="impl.BookDaoImpl"/><!--定义userService--><bean id="userService" class="service.UserService"><constructor-arg index="0" ref="userDao"/><constructor-arg index="1" ref="bookDao"/></bean>
</beans>
也可以使用name
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="bookDao" ref="bookDao"/>
要注意构造方法对应的参数名字不要写错
注意:使用构造注入,类中一定要有个无参构造方法,如果没有会报错。必须按照类中定义的顺序进行注入,否则会抛出BeanCreationException类型不匹配异常
注入内部Bean
在property标签中嵌套bean标签——内部Bean
<!-- 声明bean--><bean id="orderDaoBean" class="dao.OrderDao"></bean><bean id="orderDaoService" class="service.OrderService"><!--内部bean--><property name="orderDao"><bean class="dao.OrderDao"></bean></property></bean>
注入简单类型
使用value属性
创建实体类
public class User {private int age;private String username;public void setUsername(String username) {this.username = username;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"age=" + age +", username='" + username + '\'' +'}';}
}
<bean id="userBean" class="model.user"><property name="username" value="zhangsan"/><property name="age" value="15"/>
</bean>
注入集合类型
Spring框架支持注入集合类型的注入
假设我们的实体类包括数组类型、List类型、Map类型、Set类型等
Book类
@Data
@AllArgsConstructor//有参构造
@NoArgsConstructor//无参构造
public class Book {private String bookName;private String author;private Integer price;
}
添加lombok依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.36</version>
</dependency>
Student类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private String UserName;private Book[] books;private List<Book> bookList;private Map<String,Book> bookMap;
}
XML配置
<bean id="book1" class="model.Book"></bean>
<bean id="book2" class="model.Book"></bean>
<bean id="book3" class="model.Book"></bean>
<bean id="book4" class="model.Book"></bean>
<bean id="student" class="model.Student"><property name="userName" value="zhangsan"></property><!--数组注入--><property name="books"><array><ref bean="book1"></ref><ref bean="book2"></ref><ref bean="book3"></ref><ref bean="book4"></ref></array></property><!--List注入--><property name="bookList"><list><ref bean="book1"></ref><ref bean="book2"></ref></list></property><!--set注入--><property name="bookSet"><set><ref bean="book3"></ref><ref bean="book4"></ref></set></property><!--Map注入--><property name="bookMap"><map><entry key="01" value-ref="book1"></entry><entry key="02" value-ref="book2"></entry><entry key="03" value-ref="book3"></entry><entry key="04" value-ref="book4"></entry></map></property>
</bean>
测试类
public class StudentTest {@Testpublic void test(){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("set.xml");Student student =(Student) applicationContext.getBean("student");System.out.println(student);}
}
使用注解存储bean
把对象交给Spring IOC容器管理,可以加上类注解@Controller、@Service、@Repository、@Component、@Configuration.
• @Controller:控制层,接收请求,对请求进行处理,并进行响应.
• @Servie:业务逻辑层,处理具体的业务逻辑.
• @Repository:数据访问层,也称为持久层.负责数据访问操作
• @Configuration:配置层.处理项目中的⼀些配置信息.
程序应用分层调用流程:
使用@Bean获取对象
@Controller
使用@Controller存储bean
@Controller
public class HController {public void print(){System.out.println("do HController");}
}
通过ApplicationContext上下文管理Bean
@SpringBootApplication
public class IocDemoApplication {public static void main(String[] args) ApplicationContext context = SpringApplication.run(IocDemoApplication.class, args);HController hController=context.getBean(HController.class);hController.print();
}
HController类
@Controller
public class HController {public void print(){System.out.println("do HController");}
}
不加@Controller会报找不到bean的cuow
Bean的命名规范:命名约定使用Java标准约定作为实例字段名
bean名称以小写字母开头,然后使用驼峰式大小写.
特殊情况,当有多个字符并且第一个和第二个字符都是大写时,将保留原始的大小写.比如HController
@Service、@Repository、@Component、@Configuration使用方法类似
注意:使用@Service注解时应不能发起请求,报404
未加 @Servie注解
未加 @Component注解
未加 @Configuration注解
未加 @Repository注解
方法注解@Bean
类注解是添加到某个类上的,但是存在两个问题:
1. 使用外部包里的类,没办法添加类注解
2. ⼀个类,需要多个对象,比如多个数据源
方法注解的使用
Spring框架的设计中,方法注解 @Bean 要配合类注解才能将对象正常的存储到Spring容器中
@Bean注解的bean,bean的名称就是它的方法名
定义多个对象
@Component
public class StrudentComponent {@Beanpublic Student s1(){return new Student("zhangsan",10);}@Bean()public Student s2(){return new Student("lisi",10);}
}
期望只有⼀个匹配,结果发现了两个
设置name属性给Bean对象进⾏重命名操作
扫描路径
通过注解@ComponentScan 来配置扫描路径.(不推荐使用)
推荐做法: 把启动类放在我们希望扫描的包的路径下,这样我们定义的bean就都可以被扫描到
依赖注入
使用@Autowired 实现的
属性注入
@Autowired
private UserService userService;//属性注入
构造器注入
@Autowired
public HelloController(UserService userService, UserConfig userConfig) {this.userService = userService;this.config = userConfig;}
setter方法注入
@Autowired
public void setUserService(UserService userService) {this.userService = userService;
}
使用@Value
注入基本类型、字符串或配置文件中的属性
@Value("${app.timeout:100}")
private int timeout;
@Resource(按名称注入)
@Component
public class StrudentComponent {@Bean("s5")public Student s2(){return new Student("lisi",10);}
}
@Service
public class UserService {@Resource(name="s5")private Student s3;
}
Test类
@SpringBootApplication
public class IocDemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(IocDemoApplication.class, args);Student bean=(Student)context.getBean("s5");System.out.println(bean);}
}
当存在多个同类型 Bean 时,按名称指定具体 Bean
使用注解@Qualifier
@Component
public class StrudentComponent {@Beanpublic Student s1(){return new Student("zhangsan",10);}@Bean("s5")public Student s2(){return new Student("lisi",10);}}
@Service
public class UserService {@Qualifier("s5")@Autowiredprivate Student s3;
}
使用@Primary注解:当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现.
@Component
public class StrudentComponent {@Primary@Beanpublic Student s1(){return new Student("zhangsan",10);}@Beanpublic Student s2(){return new Student("lisi",10);}
三种注入方式优缺点分析
在 Spring 依赖注入中,共有三种主要方式:属性注入(字段注入)、构造函数注入和 Setter 注入。每种方式各有其适用场景和优缺点,以下是详细分析。
一、属性注入(字段注入)
优点:
简洁方便
代码量少,直接在字段上添加注解即可完成注入,适合快速开发。
缺点:
强耦合于 IoC 容器
只能在 Spring 等 IoC 容器中使用,脱离容器后字段无法初始化,直接使用会抛出NullPointerException。
无法注入 final 修饰的字段
final 字段必须在构造方法中初始化,而属性注入的时机在对象实例化之后,导致编译错误。
测试困难
需依赖 Spring 容器进行单元测试,或通过反射手动注入依赖。
二、构造函数注入(Spring 4.X 推荐)
优点:
支持 final 字段
依赖在构造方法中初始化,允许字段声明为 final,确保对象不可变。
依赖完全初始化
对象创建时即完成所有依赖注入,避免使用过程中出现未初始化的NullPointerException。
代码健壮性高
依赖关系通过构造方法显式声明,强制调用方提供必要依赖,减少隐含错误。
通用性强
不依赖特定框架,纯 Java 语法实现,更换框架时无需修改注入逻辑。
解决循环依赖
Spring 优先通过构造方法解决循环依赖,若无法解决会直接抛出异常,避免运行时问题。
缺点:
代码冗余
当依赖较多时,构造方法参数列表较长,可通过 Lombok 的 @RequiredArgsConstructor 简化
三、Setter 注入(Spring 3.X 推荐)
通过 @Autowired 标注在 Setter 方法上实现依赖注入。
优点:
灵活性高
允许在对象创建后重新注入或修改依赖,适用于动态配置场景。
缺点:
无法注入 final 字段
与属性注入相同,Setter 方法无法初始化 final 字段。
依赖可能被修改
Setter 方法可被多次调用,导致依赖对象被意外覆盖,破坏对象状态一致性。
依赖初始化时机不确定
依赖可能在对象部分初始化后注入,若在初始化逻辑中提前使用依赖,可能引发NullPointerException。
相关文章:
SpringIoC和DI
文章目录 OCP开闭原则DIP(依赖倒置原则)IOC(控制反转)依赖注入DI基于XML配置Beanset注入构造注入 使用注解存储beanController方法注解Bean扫描路径依赖注入三种注入方式优缺点分析 引入 当我们写了一个程序,遵循SpringMVC三层架构,表现层调用业务逻辑层…...
vue 路由
目录 一、路由的使用 二、声明式导航 2.1 声明式导航 2.2 声明式导航路由传参 2.2.1.字符串写法 2.2.2.对象写法 2.2.3 query 传参和 param 传参总结 2.3 命名路由 2.4 可选操作符 2.5 props 参数 三、编程式导航 3.1 replace 和 push 跳转…...
JAVA常见的 JVM 参数及其典型默认值
在 Java 线上应用中,JVM 参数的默认值取决于具体的 JVM 实现(如 Oracle JDK、OpenJDK、Zulu 等)、版本(如 Java 8、11、17 等)以及运行环境(物理机、容器等)。以下是常见的 JVM 参数及其典型默认…...
文件压缩与解压(zip4j)
maven依赖 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.11.5</version></dependency>示例 //参数配置ZipParameters parameters new ZipParameters();parameters.setCompres…...
【操作系统】查内存泄漏方法
【操作系统】查内存泄漏方法 1. 通用检测方法1.1 代码审查1.2 运行时监测 2.Linux平台检测工具2.1 Valgrind工具套件2.2 AddressSanitizer (ASan)2.3 mtrace 3.Windows平台检测工具3.1 Visual Studio诊断工具3.2 CRT调试堆 4.嵌入式系统检测方法4.1 RT-Thread内存检测4.2 自定义…...
oracle常用sql
获取主键 1. 查询主键的两种常用方法 Oracle 的主键信息存储在以下两个视图中: USER_CONSTRAINTS:存储当前用户下所有表的约束信息(如主键、外键等)。 USER_CONS_COLUMNS:存储约束对应的列信息。 方法 1ÿ…...
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【思路篇】A题解题全流程(持续更新)
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程-思路(持续更新) 写在前面: 1、A题、C题将会持续更新,陆续更新发布文章 2、赛题交流咨询Q群:1037590285 3、全家桶依旧包含: 代码、…...
Qt 信号量使用方法
Qt 信号量使用方法 QSemaphore 类 常用函数介绍 函数名称函数功能QSemaphore()构造并初始化对象acquire()尝试获取n个资源,如果没有那么多资源,线程将阻塞直到有n个资源可用available()返回当前信号量可用的资源个数,这个数永远不可能为负…...
C++进阶——封装哈希表实现unordered_map/set
与红黑树封装map/set基本相似,只是unordered_map/set是单向迭代器,模板多传一个HashFunc。 目录 1、源码及框架分析 2、模拟实现unordered_map/set 2.1 复用的哈希表框架及Insert 2.2 iterator的实现 2.2.1 iteartor的核心源码 2.2.2 iterator的实…...
AI Agent 实战:搭建个人在线旅游助手
AI Agent 实战:搭建个人在线旅游助手 本次实验中,我们将继续探索 Agent 的提示词,学习更加规范的提示词撰写方法。 本实验中你将掌握的知识点 使用 Dify 构建 Agent 的方法结构化的提示词撰写技巧变量的使用方法 1. 准备 在新建 Agent 之…...
CSS中的overflow属性
在 CSS 中,overflow 属性用于控制当一个元素的内容溢出其指定的区域时,应该如何处理溢出的部分。通常用于盒模型(如 div)中,指定内容超出容器时的显示方式。 overflow 属性的常用值: 1. visible(…...
【Unity】处理文字显示不全的问题
1.选中字体文件,检查 MultiAtlasTeextures 是否勾选,未勾选的话,先勾选保存后查看是否显示正常 2.勾选后未正常显示,则在搜索框中输入未显示的文本,确认字体图集是否包含该文本,然后点击Update Atlas Textu…...
蓝桥备赛指南(11):递归简介
递归的介绍 概念:递归是指函数直接或间接调用自身的过程。 解释递归的两个关键要素: 基本情况(递归终止条件):递归函数中的一个条件,当满足该条件时,递归终止,避免无限递归。可以…...
Python 图片水印处理工具
自定义水印文本自定义水印位置支持图片裁剪支持各种图片格式 from PIL import Image, ImageDraw, ImageFont import osclass ImageWatermarker:def __init__(self, font_pathNone, font_size40):"""初始化水印处理器font_path: 字体文件路径,默认使…...
从零开始:如何打造一套完整的UI设计系统?
1. 建立色彩系统 色彩系统是设计系统的基础之一,它不仅影响界面的整体美感,还对用户体验有着深远的影响。首先,设计师需要定义主色调、辅助色和强调色,并确保这些颜色在不同场景下的应用保持一致。使用工具如Adobe Color或Coolor…...
Jenkins + CICD流程一键自动部署Vue前端项目(保姆级)
git仓库地址:参考以下代码完成,或者采用自己的代码。 南泽/cicd-test 拉取项目代码到本地 使用云服务器或虚拟机采用docker部署jenkins 安装docker过程省略 采用docker部署jenkins,注意这里的命令,一定要映射docker路径,否则无…...
c# 虚函数、接口、抽象区别和应用场景
文章目录 定义和语法实现要求继承和使用场景总结访问修饰符设计目的性能扩展性在 C# 里,虚函数、接口和抽象函数都能助力实现多态性,不过它们的定义、使用场景和特点存在差异,下面为你详细剖析: 定义和语法 虚函数:虚函数在基类里定义,使用 virtual 关键字,且有默认的实…...
数据治理的主题库是做什么的
数据治理的主题库详解 一、定义与核心概念 主题库是数据治理体系中的核心组件,指围绕某一业务主题或实体对象,通过数据清洗、整合、标准化等手段形成的逻辑化、高质量数据集。其核心特征包括: 主题导向:以业务领域(…...
pytorch模型的进阶训练和性能优化
综合案例 将MNIST数据集保存成本地图片读取本地图片进行训练读取自己的数据集进行训练用自己的模型进行训练获得更多评价指标提升模型性能的方法 MNIST转本地图片 import os import torchvision import torchvision.transforms as transforms# 下载MNIST数据集 transform t…...
i18next在vue3中的应用,可参考写法或直接复用
i18next是一个国际化相关的的依赖,适配多种框,比如vue2/3,react,next.js等等,是一个非常实用的依赖。在一次项目中接触过i18n相关内容,因此今天就整理一下这个通用的插件。 官网:Introduction …...
DM数据迁移工具
DM数据迁移工具 一、概述二、迁移准备三、启动迁移工具1.Windows 环境启动 DM 数据迁移工具2.Linux 环境启动 DM 数据迁移工具2.1启用图形化安装界面前需要通过如下命令将图形界面权限放开:2.2进入数据库安装路径 /tool 目录下,运行 ./dts 即可启动 DM 数…...
Python入门(4):函数
目录 1 基本概念 1.1 函数的定义与调用 2 函数的参数 2.1 位置参数(Positional Arguments) 2.2 默认参数(Default Arguments) 2.3 关键字参数(Keyword Arguments) **2.4 可变参数(*…...
Java基础-25-继承-方法重写-子类构造器的特点-构造器this的调用
在面向对象编程中,继承是实现代码复用和扩展的重要机制。通过继承,子类可以继承父类的属性和方法,并且可以通过方法重写来改变或扩展父类的行为。此外,构造器在对象初始化过程中扮演了重要角色,尤其是在子类构造器中如…...
Mysql之事务(上)
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1.什么需要为事务? 2.事务的四个特性 1. 原子性࿰…...
2025华为软件精英挑战赛2600w思路分享
这里写自定义目录标题 得分展示对象定义请求价值计算时间同步删除操作完整思路 得分展示 对象定义 // 将一个磁盘划分为多个基于标签聚合的区块 class Block{ public:int tag 0; // 区块标签int start_pos;int end_pos;int id;int use_size 0;int v;// 为区块确定范围Bloc…...
LSTM网络是什么?
环境: LSTM网络 问题描述: LSTM网络是什么? 解决方案: LSTM 网络解释 LSTM(Long Short-Term Memory)网络 是一种特殊的递归神经网络(RNN),能够学习长期依赖关系。L…...
bert自然语言处理框架
自然语言处理框架 目录 自然语言处理框架bert自然语言处理框架概念核心特点应用场景 框架和数据集结构编码-解码框架Self-Attention 机制multi-headed机制位置编码Add与Normalize整体框架outputs训练数据集 bert自然语言处理框架 概念 BERT(Bidirectional Encoder …...
UE5学习笔记 FPS游戏制作33 游戏保存
文章目录 核心思想创建数据对象创建UIUI参数和方法打开UI存档文件的位置可以保存的数据类型 核心思想 UE自己有保存游戏的功能,核心节点,类似于json操作,需要一个数据类的对象来进行保存和读取 创建存档 加载存档 保存存档 创建数据对象…...
【超详细】一文解决更新小米澎湃2.0后LSPose失效问题
【超详细】一文解决更新澎湃2.0后LSPose失效问题 问题分析: 出现这个问题大多是因为本次为大版本更新A14->A15,因此原来的LSPose无法支持新系统特性导致的,因此我们从此出发解决这个问题。 方案一(magisk): 直接…...
Python爬虫教程007:scrapy结合实际案例的简单使用
文章目录 3.1 scrapy安装3.2 scrapy的基本使用3.2.1 scrapy项目的创建和运行3.3 58同城案例3.3.1 创建案例3.3.2 项目结构说明3.4 汽车之家案例3.1 scrapy安装 什么是scrapy: Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘、信息处…...
【可能性:如何从已有条件中分析一件事情是否会发生? 关键字摘抄】
是否可以直接从前提条件给出的信息中,推理出一件事情是否会发生呢?还真的可以,这一讲,我们就来说说,什么是逻辑上的必然性,可能性和排他性。 白马非马? 春秋战国百家争鸣时期,名家…...
WPS JS宏编程教程(从基础到进阶)-- 第四部分:函数与自定义功能开发
第四部分:函数与自定义功能开发 1. 函数的创建与调用**基础概念****1.1 命名函数与匿名函数****命名函数示例:计算矩形面积****匿名函数示例:动态赋值****1.2 箭头函数****特点**:简化语法,自动继承外层 `this`。2. 自定义函数实战**2.1 身份证信息提取函数****功能**:从…...
Pytorch 张量操作
在深度学习中,数据的表示和处理是至关重要的。PyTorch 作为一个强大的深度学习框架,其核心数据结构是张量(Tensor)。张量是一个多维数组,类似于 NumPy 的数组,但具有更强大的功能,尤其是在 GPU …...
constant(safe-area-inset-bottom)和env(safe-area-inset-bottom)在uniapp中的使用方法解析
在微信小程序中,padding-bottom: constant(safe-area-inset-bottom); 和 padding-bottom: env(safe-area-inset-bottom); 这两个 CSS 属性用于处理 iPhone X 及更高版本设备的安全区域(safe area)。这些设备的底部有一个“Home Indicator”&a…...
ROS相关学习笔记
以下是创建并初始化一个新的 catkin 工作空间的具体步骤 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace #这会在 src 目录下创建一个 CMakeLists.txt 文件 构建工作空间 进入工作空间根目录并构建 cd ~/catkin_ws catkin_make 或者,…...
大模型专题10 —LangGraph高级教程:构建支持网页搜索+人工干预的可追溯对话系统
在本教程中,我们将使用 LangGraph 构建一个支持聊天机器人,该机器人能够: ✅ 通过搜索网络回答常见问题 ✅ 在多次调用之间保持对话状态 ✅ 将复杂查询路由给人工进行审核 ✅ 使用自定义状态来控制其行为 ✅ 进行回溯并探索替代的对话路径 我们将从一个基础的聊天机器人开…...
rbpf虚拟机-汇编和反汇编器
文章目录 一、概述二、主要功能三、关键函数解析3.1 汇编器3.1.1 parse -转换为Instruction列表3.1.2 assemble_internal-转换为Insn 3.2 反汇编器3.2.1 to_insn_vec-转换为机器指令 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [rbpf虚拟机-汇编和反汇编器] ❤…...
压测数据说话:如何用科学方法选择最优高防套餐?
一、压测数据到高防参数的映射规则 1. 带宽需求计算 所需防护带宽 压测崩溃带宽 安全系数(建议1.5倍) 示例:测试崩溃值50Gbps → 选择75G套餐(群联资费表“100G套餐¥8,500/月”) 2. 连接数容量评估 …...
【初阶数据结构】队列
文章目录 目录 一、概念与结构 二、队列的实现 队列的定义 1.初始化 2.入队列 3.判断队列是否为空 4.出队列 5.取队头数据 6.取队尾数据 7.队列有效个数 8.销毁队列 三.完整源码 总结 一、概念与结构 概念:只允许在一端进行插入数据操作,在另一端进行删除…...
ai说js的instanceof是什么怎么用
instanceof 是一个用于检测对象是否是某个构造函数的实例的操作符 (1)检测内置类型 对于 JavaScript 的内置类型,instanceof 可以用来检测对象是否是某种内置类型的实例。 let arr [1, 2, 3]; console.log(arr instanceof Array); // tru…...
PyTorch中知识蒸馏浅讲
知识蒸馏 在 PyTorch 中,使用 teacher_model.eval() 和冻结教师模型参数是知识蒸馏(Knowledge Distillation)中的关键步骤。 1. teacher_model.eval() 的作用 目的: 将教师模型切换到评估模式,影响某些特定层(如 Dropout、BatchNorm)的行为。 具体影响: Dropo…...
服务器自动备份到本地,服务器自动备份到本地的方法有哪些?
服务器自动备份到本地是确保数据安全和系统恢复能力的关键步骤。以下是几种常见的服务器自动备份到本地的方法: 一、使用系统自带的备份工具 Windows Server Windows Server Backup 简介:Windows Server Backup是Windows Server操作系统内置的备份和…...
Vue+Elementui首页看板
源码 <template><!-- 查询条件--><div class="optimize-norm" v-loading="selectDataLoading"><el-form :model="queryParams" ref="queryRef" style="padding-bottom:8px" :inline="true"…...
力扣HOT100之链表:141. 环形链表
这道题都已经刷烂了,没啥好说的,就是定义快慢指针,慢指针每次移动一步,快指针每次移动两步,如果链表中有环,那么快指针一定会追上慢指针,追上时直接返回true,否则快指针会直接到达链…...
vue实现俄罗斯方块
说明: vue实现俄罗斯方块 效果图: step1:C:\Users\wangrusheng\PycharmProjects\untitled3\src\views\Game.vue <script setup> import { ref, reactive, computed, onMounted, onUnmounted } from vueconst SHAPES [[[1, 1, 1, 1]], // I[[1, …...
Web3.0隐私计算与云手机的结合
Web3.0隐私计算与云手机的结合 Web3.0隐私计算与云手机的结合,标志着从“数据垄断”向“数据自主”的范式转变。通过技术互补,两者能够构建更安全、高效且用户主导的数字生态。尽管面临技术整合和成本挑战,但随着区块链、AI和分布式存储的成…...
git | 版本切换的相关指令
常见指令 git log --oneline #查看历史提交 git tag latest-backup # 对当前的提交进行标记,标记名为latest-backup git checkout -b old-version 55b16aa # 切换到[55b16aa]的提交中,并标记为[old-version]的分支 git checkout master …...
基于 Fluent-Bit 和 Fluentd 的分布式日志采集与处理方案
#作者:任少近 文章目录 需求描述系统目标系统组件Fluent BitFluentdKafka 数据流与处理流程日志采集日志转发到 Fluentd日志处理与转发到 KafkaKafka 作为消息队列 具体配置Fluent-Bit的CM配置Fluent-Bit的DS配置Fluentd的CM配置Fluentd的DS配置Kafka查询结果 需求…...
【渗透测试】Vulnhub靶机-FSoft Challenges VM: 1-详细通关教程
下载地址:https://www.vulnhub.com/entry/fsoft-challenges-vm-1,402/ 目录 前言 信息收集 目录扫描 wpscan扫描 修改密码 反弹shell 提权 思路总结 前言 开始前注意靶机简介,当第一次开机时会报apache错误,所以要等一分钟后重启才…...
c语言strcat和strlen的注意事项
1 .strlen C库函数size_t strlen(const char* str)计算字符串str的长度,直到空字符,不包括空字符。在C语言中,字符串实际上是使用空字符\0结尾的一维字符数组。空字符(Null character)又称结束符,缩写NUL&…...