Spring Bean 的初始化流程如下:
-
实例化 Bean 对象
-
Spring 容器根据配置中的 Bean Definition(定义)中实例化 Bean 对象。
Bean Definition 可以通过 XML,Java 注解或 Java Config 代码提供。
Spring 使用依赖注入填充所有属性,如 Bean 中所定义的配置。
-
- Aware 相关的属性,注入到 Bean 对象
- 如果 Bean 实现 BeanNameAware 接口,则工厂通过传递 Bean 的 beanName 来调用
#setBeanName(String name)
方法。 - 如果 Bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用
#setBeanFactory(BeanFactory beanFactory)
方法。
- 如果 Bean 实现 BeanNameAware 接口,则工厂通过传递 Bean 的 beanName 来调用
- 调用相应的方法,进一步初始化 Bean 对象
- 如果存在与 Bean 关联的任何 BeanPostProcessor 们,则调用
#preProcessBeforeInitialization(Object bean, String beanName)
方法。 - 如果 Bean 实现 InitializingBean 接口,则会调用
#afterPropertiesSet()
方法。 - 如果为 Bean 指定了 init 方法(例如
<bean />
的init-method
属性),那么将调用该方法。 - 如果存在与 Bean 关联的任何 BeanPostProcessor 们,则将调用
#postProcessAfterInitialization(Object bean, String beanName)
方法。
- 如果存在与 Bean 关联的任何 BeanPostProcessor 们,则调用
Spring Bean 的销毁流程如下:
- 如果 Bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用
#destroy()
方法。 - 如果为 bean 指定了 destroy 方法(例如
<bean />
的destroy-method
属性),那么将调用该方法。
整体如下图:
Spring实现Aware接口 https://www.jianshu.com/p/7ce88398cf78
InitializingBean的作用 https://blog.csdn.net/maclaren001/article/details/37039749
Spring 的 BeanPostProcessor 原理剖析及使用 https://www.jianshu.com/p/58d2bddcb871
写代码简单比较init-method,afterPropertiesSet和BeanPostProcessor https://www.2cto.com/kf/201310/251778.html