Spring Bean的生命周期主要有四个阶段:
- 实例化 -> Instantiation
- 属性赋值 -> Populate
- 初始化 -> Initialization
- 销毁 -> Destruction
实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段
Bean定义
spring在启动时,会去扫描在xml/注解/JavaConfig中需要被Spring管理的Bean信息,这些信息会被封装成BeanDefinition,并把这些信息放到BeanDefinitionMap中,这个Map中key是bean的名字,value是BeanDefinition对象
容器启动完成后,会根据BeanDefinition去实例化Bean
实例化
spring中是使用反射来实现的,通过反射选择合适的构造器把对象实例化,这里只是将对象创建出来,对象的具体属性还没有注入,实例化对象被包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口。
属性赋值
实例化后的对象被封装在BeanWrapper对象中,并且此时对象仍是一个原生的状态,并没有属性的依赖注入,Spring会根据BeanDefinition的信息进行依赖注入,并且通过BeanWrapper提供的设置属性的接口完成依赖注入
初始化
首先判断该Bean是否Aware接口,如果存在则填充相关的资源
如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
如果实现BeanFactory,Spring将调用setBeanFactory()方法将BeanFactory容器实例传入
如果实现ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文传入
BeanPostProcessor
Aware相关的接口处理完之后,就会调用到BeanPostProcessor后置处理器,它有两个处理方法Before和After,
Before会将正在初始化的bean传入,我们就可以对这个Bean进行处理,这个方法先于InitialzationBean执行,被称为前置处理,所有的Aware接口的注入就是在这一步完成的,执行完Aware相关接口后就会执行before的方法
初始化扩展
后置处理器中before的方法执行完毕后就会执行init相关方法,例如@PostConstruct,实现InitializingBean接口,xml中定义的init-method的方法
执行顺序就是:@PostConstruct -> 实现InitializingBean接口 -> xml中定义的init-method的方法
init方法执行完了之后,就会执行BeanPostProcessor的after方法
以上几个步骤完成后,Bean就以经被正确创建了,之后就可以使用这个Bean了
生存期
Bean已经准备就绪,可以被应用程序使用,他们将一直驻留在应用上下文中,直到上下文被销毁
销毁
如果Bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method声明销毁方法,该方法也会被调用。