找回密码
 立即注册
首页 业界区 安全 spring6-bean的生命周期与循环依赖

spring6-bean的生命周期与循环依赖

龙骋唧 2026-2-4 02:00:19
bean的生命周期

粗略划分5步


  • 实例化bean
调用的是无参数的构造方法

  • bean属性赋值
执行set注入

  • 初始化bean
调用bean的init()方法,需要自己写,自己配

  • 使用bean
  • 销毁bean
调用bean的destroy(),需要自己写,自己配
注意:自定义的init()和destroy()需要在配置文件配置
  1.   <bean  />  <bean  /><bean id="user"  <bean  />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
1.png
  1. // 日志类bean后处理器public class LogBeanPostProcessor implements BeanPostProcessor {  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>@Override  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>System.out.println("BeanPostProcessor befor方法");  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>}  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>@Override  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>System.out.println("BeanPostProcessor after方法");  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>}}
复制代码
  1.   <bean  />
复制代码
精细化分为10步


  • 实例化bean
调用的是无参数的构造方法

  • bean属性赋值
执行set注入

  • 检查bean是否实现Aware相关接口(BeanNameAware, BeanClassLoaderAware, BeanFactoryAware),如果实现了,则调用这些接口相关的方法。
  • 执行“Bean后处理器”的before方法
  • 检查bean是否实现InitializingBean接口,并调用接口方法
  • 初始化bean
调用bean的init()方法,需要自己写,自己配

  • 执行“Bean后处理器”的after方法
  • 使用bean
  • 检查bean是否实现了DisposableBean接口,并调用接口方法
  • 销毁bean
调用bean的destroy(),需要自己写,自己配
spring容器只对singleton的bean进行完整的生命周期管理。
如果是prototype作用域的bean,spring容器只负责初始化完毕,等客户端程序一旦获取到该bean后,spring容器就不再管理该对象的声明周期了。
自己new的对象如何让spring容器管理

使用DefaultListableBeanFactory类注入自己创建的对象。
  1. public static void main(String[] args) {  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>User user = new User();  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>System.out.println(user);  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>// 将以上new的对象交给spring容器管理  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>beanFactory.registerSingleton("userBean", user);  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>// 从spring容器中获取  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>Object userBean = beanFactory.getBean("userBean");  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>System.out.println(userBean);}
复制代码
bean的循环依赖问题

bean的循环依赖:A对象中有B属性。B对象中有A属性。这种你依赖我,我依赖你的情况就是循环依赖。
singleton+setter模式
  1.   <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>
复制代码
  1. 在这种模式(singleton+setter)下主要分为2个阶段来解决:  <bean  /> 1. 在spring容器加载的时候,实例化bean。只要其中任意一个bean实例化之后,马上进行“曝光”【不等属性赋值就曝光】  <bean  /> 2. bean“曝光”后再进行赋值
复制代码
prototype+setter模式
  1.   <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>  <bean  />  <bean  /><bean id="user"  <bean  />init-method="initBean" destroy-method="destroyBean"></bean>
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

2026-2-9 08:42:44

举报

2026-2-9 16:22:31

举报

2026-2-9 20:11:11

举报

2026-2-10 08:00:55

举报

2026-2-28 10:33:11

举报

您需要登录后才可以回帖 登录 | 立即注册