Spring的生命周期
介绍
大白话 简单来说就是4个阶段
- 实例化
- 属性赋值
- 初始化
- 销毁
- 实例化:第一步,实例化一个bean对象;
- 属性赋值:第二步,为bean设置相关属性和依赖;
- 初始化:第3~7步,其中5、6步位初始化操作,3,4步在初始化之前执行,第7步在初始化后执行,该阶段结束,才能被用户使用;
- 销毁:第8~10步,第8步先在使用前注册了销毁的相关接口,后面的步骤真正销毁bean时执行相应方法。
详解
// AbstractAutowireCapableBeanFactory.java
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// 1. 实例化
BeanWrapper instanceWrapper = null;
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
Object exposedObject = bean;
try {
// 2. 属性赋值
populateBean(beanName, mbd, instanceWrapper);
// 3. 初始化
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
// 4. 销毁-注册回调接口
try {
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
return exposedObject;
}
1.实例化bean
对于BeanFactory容器来说,当用户向容器请求一个尚未初始化的 Bean 或初始化 Bean 的时候,如果需要注入另一个尚未初始化的依赖,容器就会调用createBean进行实例化;对于ApplicationContext容器来说,当容器启动结束后,便实例化所有的 Bean。
容器通过获取BeanDefinition对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入。 实例化对象被包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口,从而避免了使用反射机制设置属性。
2.属性赋值
实例化后的对象被封装在BeanWrapper对象中,且此时对象仍然是原生的状态,没有进行依赖注入。接着Spring根据BeanDefinition中的信息进行依赖注入,并且通过BeanWrapper提供的设置属性的接口完成依赖注入。
3.初始化
- 注入Aware接口
若Spring检测到bean实现了Aware接口,则会为其注入相应的依赖给Bean。
BeanNameAware:该接口用来获取bean的id或者name
BeanFactoryAware:用来获取当前环境的BeanFactory
BeanClassLoaderAware:注入加载当前bean的ClassLoader
ApplicationContextAware:用来获取当前环境的ApplicationContext
- BeanPostProcessor
当经过以上步骤,Bean对象被正确构造,但如果想要对象被使用前再进行一些自定义的处理,就可以通过BeanPostProcessor接口实现postProcessBeforeInitialzation:被称为前置处理,所有Aware接口的注入就是在这一步完成的。在初始化之前调用此方法
postProcessAfterInitialzation:这个函数会在InitialzationBean完成后执行,被称为后置处理。在初始化之后调用此方法 - InitializingBean
当BeanPostProcessor的前置处理完成后就会进入本阶段InitializingBean:该接口只有一个方法afterPropertiesSet(),在属性注入完成后调用
4.销毁
如果 Bean 实现了DispostbleBean接口,Spring 将调用它的destory方法,作用与在配置文件中对 Bean 使用destory-method属性的作用一样,都是在 Bean 实例销毁前执行的方法。
总结
- 首先是实例化、属性赋值、初始化、销毁这 4 个大阶段;
- 再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;
- 销毁的具体操作,有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁。
补充-Spring bean的注入过程
Spring容器启动时候,会扫描xml配置文件,当扫描到bean标签,会将这个类的全路径以为key,value存到内置的map中
Enjoy Reading This Article?
Here are some more articles you might like to read next: