SpringBoot中bean的生命周期
Spring Bean的生命周期指的是Bean从创建到初始化再到销毁的过程,这个过程由IOC容器管理。
-
1 生命周期
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<em id="__mceDel"> throws BeanCreationException { BeanWrapper instanceWrapper = null; if (instanceWrapper == null) { // 实例化阶段 instanceWrapper = createBeanInstance(beanName, mbd, args); } Object exposedObject = bean; try { // 属性赋值阶段 populateBean(beanName, mbd, instanceWrapper); // 初始化阶段 exposedObject = initializeBean(beanName, exposedObject, mbd); }<br><br><span class="hljs-keyword"> try {<br> //销毁-注册回调接口<br></span> registerDisposableBeanIfNecessary(beanName, bean, mbd);<br> }</em> |
|
1
|
} |
-
2 步骤
- 实例化:第 1 步,实例化一个 bean 对象;
- 属性赋值:第 2 步,为 bean 设置相关属性和依赖;
- 初始化:第 3~7 步,步骤较多,其中第 5、6 步为初始化操作,第 3、4 步为在初始化前执行,第 7 步在初始化后执行,该阶段结束,才能被用户使用;
- 销毁:第 8~10步,第8步不是真正意义上的销毁(还没使用呢),而是先在使用前注册了销毁的相关调用接口,为了后面第9、10步真正销毁 bean 时再执行相应的方法。
-
3 步骤
Aware 接口有:
- BeanNameAware:注入当前 bean 对应 beanName;
- BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader;
- BeanFactoryAware:注入 当前BeanFactory容器 的引用。
ApplicationContext 类型的容器使用BeanPostProcessor
- EnvironmentAware:注入 Enviroment,一般用于获取配置属性;
- EmbeddedValueResolverAware:注入 EmbeddedValueResolver(Spring EL解析器),一般用于参数解析;
- ApplicationContextAware(ResourceLoader、ApplicationEventPublisherAware、MessageSourceAware):注入 ApplicationContext 容器本身。
BeanPostProcessor 是 Spring 为修改bean提供的扩展点,其可作用于容器中所有 bean。
-
对于标记接口的实现类,进行自定义处理。如ApplicationContextAwareProcessor,为其注入相应依赖;再举个例子,自定义对实现解密接口的类,将对其属性进行解密处理;
-
为当前对象提供代理实现。例如 Spring AOP 功能,生成对象的代理类,然后返回。
InitializingBean 和 init-method
InitializingBean 和 init-method 是 Spring 为bean的初始化提供的扩展点。
InitializingBean接口 的定义如下:
public interface InitializingBean { void afterPropertiesSet() throws Exception; }
在 afterPropertiesSet() 方法写初始化逻辑。
指定 init-method 方法,指定初始化方法。
-
4 总结
最后总结下如何记忆 Spring Bean 的生命周期:
- 首先是实例化、属性赋值、初始化、销毁这 4 个大阶段;
- 再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;
- 销毁的具体操作,有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁。
转载自文章csdn


浙公网安备 33010602011771号