SpringBean加载的全过程
首先分为几个大部分,然后spirng会对这个每个小部分的前后进行操作。
实例化
填充注入
初始化
使用
销毁
一、实例化
在我们实例化一个bean之前,我们有机会对它的BeanDefinition以及对IOC容器进行操作。
这里主要介绍的有BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor这两个接口,其中BeanDefinitionRegistryPostProcessor继承BeanFactoryPostProcessor,这两个都是容器级别的接口,但是在bean的生命周期中又至关重要,所以一起说了。
在我们实例化bean之前,会调用BeanDefinitionRegistryPostProcessor的实现类的postProcessBeanDefinitionRegistry方法和postProcessBeanFactory(这个方法是BeanFactoryPostProcessor,因为两者是继承关系,所以需要对这个接口进行实现),对我们的beanFactory,beanDefinition进行一些修改重定义。
在我们执行bean类构造函数之前,会调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation.(具体什么作用没了解过)。
接下来就是进行实例化,调用bean类的构造函数进行实例化。(通过cglib或者jdk自带的动态代理进行实例化)
二.属性注入
实例化后,会调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation来判断是否需要进行属性填充,如果该方法返回的是false,则代码不需要进行属性填充。
如果上述InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation返回的为true,则调用InstantiationAwareBeanPostProcessor.postProcessPropertyValues进行属性设置。
三.初始化
在初始化之前,会判断bean是否实现了BeanNameAware,BeanClassLoaderAware,BeanFactoryAware这三个接口,如果实现了进行接口实现的调用。
调用BeanPostProcessor的postProcessBeforeInitialization进行前置处理。
接下来进行初始化操作,判断是否该bean是否实现了InitializingBean,如果实现了调用它的afterPropertiesSet方法。
判断是否配置了init-method方法,如果配置,则调用这个方法
初始化完成后,调用BeanPostProcessor的后置处理方法,即postProcessAfterInitialization.
四.使用
接下来就是使用了。
五.销毁
最后在程序关闭的时候,如果bean类实现了DisposableBean接口,则调用它的destroy进行销毁。