IOC
1.IOC是什么
IOC(Inversion of Control 即控制反转)将对象交给Spring容器管理
控制反转(Inversion of Control, 缩写为IOC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI) , 还有一种方式叫“依赖查找” (Dependency Lookup)。IOC是目标,DI是实现IOC的技术手段
谁控制谁?控制什么?哪些方面反转?
谁控制了谁?是容器控制了对象
控制什么?主要控制了外部资源及生命周期
哪些方面反转?由容器帮我们查找并注入依赖的对象,对象只能被动的接收依赖对象,依赖对象的获取被反转了。
2.spring实现IOC的思路和方法
spring实现I0C的思路是提供一些配置信息用来描述类之间的依赖关系, 然后由容器去解析这些配置信息,继而维护好对象之间的依赖关系,前提是对象之间的依赖关系必须在类中定义好,比如A.class中有一个B.class的属性,那么我们可以理解为A依赖了B。既然我们在类中已经定义了他们之间的依赖关系那么为什么还需要在配置文件中去描述和定义呢?
spring实现IOC的思路大致可以拆分成3点
1.在应用程序中提供类(属性),提供依赖关系(属性或者构造方法)
2.把需要交给容器管理的对象通过配置信息告诉容器(xml. annotation, Java configuration)
3.把各个类之间的依赖关系通过配置信息告诉容器
配置这些信息的方法有三种分别是xml, annotation和java configuration,可以混合使用
维护的过程称为自动注入,自动注入的方法有两种 构造方法和setter
自动注入的值可以是对象,数组,map, list和常量比如字符串整形等
@Service //把对象交给容器管理 public class User{ @Autowired //把依赖关系告知容器 自动装配 private Student student; //提供依赖关系 }
3.生命周期和回调
了解 Spring 容器管理的 Spring Bean 生命周期,包括对 Spring 容器和 IoC 的理解。 同时了解 Spring bean 生命周期回调处理程序和后处理器。 Spring Framework 提供了几种回调方法来创建 bean 和一些方法来销毁 Spring IoC Container 中的 bean。
Spring Framework 提供了几个标记接口来更改容器中 bean 的行为; 它们包括 InitializingBean 和 DisposableBean。 实现这些接口将导致容器为前者调用 afterPropertiesSet() 并为后者调用 destroy() 以允许 bean 在初始化和销毁时执行某些操作。
3.1 Spring Bean的生命周期
从对象的创建到销毁的过程。而Spring中的一个Bean从开始到结束经历很多过程,但总体可以分为六个阶段Bean:定义、创建、属性赋值、初始化、生存期、销毁。
3.2 Spring Bean的生命周期回调
bean初始化流程 Constructor(构造器) >> @Autowired(自动装配) >> @PostConstruct(回调)
关于在spring 容器初始化 bean 设置属性后 和 销毁前 所做的回调操作定义方式有三种:
- 通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- 通过 在xml中定义init-method 和 destory-method方法
- 通过bean实现InitializingBean和 DisposableBean函数式接口,重写afterPropertiesSet()方法和destroy()方法
回调常用第一种,其他方法回与spring耦合。
初始化回调
实现 org.springframework.beans.factory.InitializingBean 接口允许在容器设置 bean 的所有必要属性后,bean 执行初始化工作。 InitializingBean 接口仅指定一种方法:
org.springframework.beans.factory.InitializingBean 接口提供初始化回调方法,如下所示…
void afterPropertiesSet() throws Exception
现在可以实现上面的接口并在这个方法中做一些初始化功能。 如下…
public class Triangle implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("为 Triangle 调用 InitializingBean init 方法"); } }
通常,可以避免使用 InitializingBean 接口(并且不鼓励使用,因为它不必要地将代码耦合到 Spring)。
现在使用 Java 注解也可以用于声明 bean 生命周期回调。
public class TriangleV2 { //init callback @PostConstruct public void myInit() { //在这里做一些初始化工作 System.out.println("为 Triangle 调用 InitializingBean init 方法"); } }
销毁回调
实现 org.springframework.beans.factory.DisposableBean 接口允许 bean 在包含它的容器被销毁时获得回调。 DisposableBean 接口指定了一种方法:
void destroy() throws Exception
现在可以实现上面的接口并在这个方法中做一些销毁动作。 如下…
public class Triangle implements InitializingBean, DisposableBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("为 Triangle 调用 InitializingBean init 方法"); } @Override public void destroy() throws Exception { //在这里做一些销毁工作 System.out.println("为 Triangle 调用 DisposableBean destroy 方法"); } }
通常,可以避免使用 DisposableBean 标记接口(并且不鼓励使用,因为它不必要地将代码耦合到 Spring)
现在使用 Java 注解也可以用于声明 bean 生命周期回调。
public class TriangleV2 { //init callback @PostConstruct public void myInit() { //在这里做一些初始化工作 System.out.println("为 Triangle 调用 InitializingBean init 方法"); } @PreDestroy public void cleanUp() { //在这里做一些销毁工作 System.out.println("为 Triangle 调用 cleanUp 方法"); } }
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术