Spring6-bean生命周期与循环依赖如何巧妙融合?
摘要:bean的生命周期 粗略划分5步 实例化bean 调用的是无参数的构造方法 bean属性赋值 执行set注入 初始化bean 调用bean的init()方法,需要自己写,自己配 使用bean 销毁bean 调用bean的destroy(),
bean的生命周期
粗略划分5步
实例化bean
调用的是无参数的构造方法
bean属性赋值
执行set注入
初始化bean
调用bean的init()方法,需要自己写,自己配
使用bean
销毁bean
调用bean的destroy(),需要自己写,自己配
注意:自定义的init()和destroy()需要在配置文件配置
<!-- init-method指定初始化方法,destroy-method指定销毁方法-->
<!-- 这两个方法需要在bean类中定义-->
<bean id="user" class="com.ali.bean.User" init-method="initBean" destroy-method="destroyBean"></bean>
进一步七步
在以上的5步中,第三步是初始化bean。其实可以在初始化之前和初始化之后添加代码。此时,需要加入“Bean后处理器”。
编写一个类实现BeanPostProcessor类,并重写before和after方法
实例化bean
调用的是无参数的构造方法
bean属性赋值
执行set注入
执行“Bean后处理器”的before方法
初始化bean
调用bean的init()方法,需要自己写,自己配
执行“Bean后处理器”的after方法
使用bean
销毁bean
// 日志类bean后处理器
public class LogBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor befor方法");
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor after方法");
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
<!-- 配置bean后处理器
这个bean后处理器会在bean实例化后和初始化前后执行相应的方法
例如可以在bean初始化前后打印日志
需要实现BeanPostProcessor接口
这样spring容器在创建其他bean时会自动调用这个后处理器的相应方法
例如上面的springBean在实例化和初始化时就会调用LogBeanPostProcessor中的方法
这样就可以在控制台看到日志输出
这个bean后处理器必须配置在spring配置文件中,才能被spring容器识别和调用
这个bean后处理器将作用于当前配置文件中的所有bean
-->
<bean class="com.ali.bean.LogBeanPostProcessor" />
精细化分为10步
实例化bean
调用的是无参数的构造方法
bean属性赋值
执行set注入
检查bean是否实现Aware相关接口(BeanNameAware, BeanClassLoaderAware, BeanFactoryAware),如果实现了,则调用这些接口相关的方法。
