IOC容器中Bean的生命周期
SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。
我们先来看看Bean的生命周期:
- 通过构造器或工厂创建Bean实例
- 为Bean的属性设置值和其他Bean的引用,
- 调用Bean的初始化方法
- Bean可以使用了
- 当容器关闭时,调用Bean的销毁方法
在Bean的声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁方法。
先做一个小测试
-
package com.figsprite.bean.cycle;
-
-
public class Car {
-
public Car(){
-
System.out.println("Car的构造函数");
-
}
-
-
public String brand;
-
-
public void setBrand(String brand) {
-
System.out.println("setBrand...");
-
this.brand = brand;
-
}
-
-
public void init(){
-
System.out.println("init...");
-
}
-
-
public void destroy(){
-
System.out.println("destroy...");
-
}
-
}
在配置文件中我们可以使用<bean>中的 init-method 和destroy-method属性指定该Bean的初始化方法和销毁方法。
-
<bean id="car" class="com.figsprite.bean.cycle.Car"
-
init-method="init" destroy-method="destroy">
-
<property name="brand" value="奔驰"/>
-
</bean>
我们创建一个测试类,就通过IOC容器创建一个Bean对象
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car = (Car) ctx.getBean("car");
ctx.close();
看看输出内容:
创建Bean后置处理器
Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理。
Bean的后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例,其典型应用是:检查Bean属性的正确性或根据特定的标准更改Bean的属性。
对Bean后置处理器而言,需要实现Interface BeanPostProcessor接口,在初始化方法被调用前后,Spring将把每一个Bean实例分别床底给上述接口的以下两个方法:
打开源码,发现这个接口就只有两个方法:一个用于Bean初始化之前,一个用于Bean初始化之后:
加上这Bean的后置处理,Bean的生命周期就会变得更加细致,我们新写一个新的类,这里的返回值我没做处理,大家可以根据具体需要,将Bean定制,将修改的Bean返回,
-
package com.figsprite.bean.cycle;
-
-
import org.springframework.beans.BeansException;
-
import org.springframework.beans.factory.config.BeanPostProcessor;
-
-
public class MyBeanPostProcessor implements BeanPostProcessor {
-
@Override
-
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-
System.out.println("postProcessBeforeInitialization"+bean+","+beanName);
-
return bean;
-
}
-
-
@Override
-
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
-
System.out.println("postProcessAfterInitialization"+bean+","+beanName);
-
return bean;
-
}
-
}
回到配置文件,配置bean的后置处理器,不需要配置id,IOC容器自动识别是一个BeanPostProcessor:
<!--配置bean的后置处理器-->
<bean class="com.figsprite.bean.cycle.MyBeanPostProcessor"/>
顺道在测试类里加一句打印car的方法,观察结果:
接下来我们在Car.java里面写一个toString方法,看看输出
一切都很正常,然后我们就可以在刚刚写的两个方法里"偷梁换柱"了:
-
package com.figsprite.bean.cycle;
-
-
import org.springframework.beans.BeansException;
-
import org.springframework.beans.factory.config.BeanPostProcessor;
-
-
public class MyBeanPostProcessor implements BeanPostProcessor {
-
-
@Override
-
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
-
System.out.println("postProcessAfterInitialization"+bean+","+beanName);
-
-
return bean;
-
}
-
-
@Override
-
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-
System.out.println("postProcessBeforeInitialization"+bean+","+beanName);
-
Car car = new Car();
-
car.setBrand("宝马");
-
return car;
-
}
-
}
我们在 postProcessAfterInitialization里将返回值做修改看看输出:
如我们所愿,不过两个方法是处理所有当前所在的配置文件中的bean的,所以一般在处理之前要判断bean的类型,作出相应动作
-
@Override
-
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
-
System.out.println("postProcessAfterInitialization"+bean+","+beanName);
-
if("car".equals(beanName)){
-
//......
-
}
-
return bean;
-
}
这样我们就可以丰富Bean的生命周期:
- 通过构造器或工厂创建Bean实例
- 为Bean的属性设置值和其他Bean的引用
- 将Bean实例传给Bean后置处理器的postProcessBeforeInitialization方法
- 调用Bean的初始化方法
- 将Bean实例传给Bean后置处理器的postProcessAfterInitialization方法
- Bean可以使用了
- 当容器关闭时,调用Bean的销毁方法
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法