前言:
前面一篇博客初步介绍了@Configuration + @Bean 的用法,这里简单总结下Spring容器中 bean 的生命周期(毕竟以前是自己各种 new 对象,现在大多交由容器帮我们管理)。
正文:
1、bean 的生命周期主要分为三个阶段:创建、初始化和销毁
- 创建:
单实例:在容器启动的时候就会创建bean;这也是后文提到 @Lazy 注解帮忙解决的问题
多实例:在getBean()的时候才会创建bean。 - 初始化:对象创建完成,并赋值好,调用初始化方法。
- 销毁:
单实例:在容器关闭的时候,会销毁对象;
多实例:容器不会管理这个bean,自然也就不会帮忙销毁。
2、容器管理bean的生命周期的几种方式:
-
方式一:
自定义初始化和销毁方法:容器在bean进行到生命周期的某一阶段时候,会调用自定义的初始化和销毁方法。
通过 @Bean(initMethod="init", destroyMethod="destory") 的形式 -
方式二:
自定义的bean去实现 InitializingBean, DisposableBean这两个接口,重写其中的方法,也可以自定义初始化和销毁逻辑 -
方式三:
使用JSR250规范中定义的两个注解(javax包中的)标注再自定义bean的特定方法上。@PostConstruct: 在bean创建完成并且属性赋值完之后,会执行初始化方法; @PreDestory: 在容器销毁bean之前,进行一定的清理工作。 -
方式四:
自定义 BeanPostProcessor(bean后置处理器)(继承相应的父类或者实现相应的接口),就可以在bean初始化前/后进行一定的处理工作。
BeanPostProcessor 接口中的两个方法如下:postProcessBeforeInitialization: 在初始化前进行工作 postProcessAfterInitialization: 在初始化后进行工作这里指的初始化前后,在下面的源码注释中已经写的非常清楚了,刚好对应前面的三种方式。


在上面这两个方法前打上断点,通过debug源码发现,其实是先遍历得到所有的 BeanPostProcessor,逐一执行每个后置处理器的 postProcessBeforeInitialization() 或者 postProcessAfterInitialization() 方法。一旦有一个执行结果为 null,直接返回结果,不会执行后续方法。说明:Spring底层对 BeanPostProcessor使用得也是非常多:例如后面还会再次提到的 XxxAware 与 XxxAwareProcessor,以及从图中也可以看到的 ApplicationContextAwareProcessor 或者 AutowiredAnnotationBeanPostProcessor 等等。
ApplicationContextAwareProcessor:某个bean实现了 ApplicationContextAware 接口之后,就可以在该 bean 中获取到 ApplicationContext 对象。 AutowiredAnnotationBeanPostProcessor:跟 @Autowired注解有关等等。BeanPostProcessor 的继承树如下所示:


1626

被折叠的 条评论
为什么被折叠?



