spring bean的生命周期
bean的生命周期有三个大的阶段:产生,使用,销毁
产生:
**启动:**准备容器/环境等
为了了解bean的需求,通过加载bean定义方法loadBeanDefinition方法用xml文件,注解扫描等方法找到所有的被定义的bean类,并且放在容器中一个定义bean集合中,即beanDefinitionMap
然后遍历这个集合,通过createBean方法创建bean对象
创建bean大体分为:构建对象 填充属性 初始化实例 注册销毁
构建对象 :通过createBeanInstance方法进行bean对象的构造,先用反射机制从"bean定义"的BeanClass找到这个类的构造方法,如果这个bean只有一个构造方法,那么只能使用这个构造方法无论有没有入参;当bean中有多个构造方法时,会先使用带有@Autowired注解的构造方法;如果多个构造方法都有@Autowired注解则会报错;如果构造方法都没有@Autowired注解则会优先拿无入参的构造方法;如果多个构造方法都是由入参的无法判断则会报错。所以不建议在任何bean中添加多个构造方法
确定了构造方法后就要准备这个构造方法需要的参数了,在单例池中,根据参数的class类进行查找,如果这个类在容器中有多个实例则会根据参数名进行匹配,如果没有找到则认为参数信息不完整报错
在参数准备好后就可以通过反射进行bean的构造了,也就是实例化,当然如果选择的是无参构造则无需参数准备直接构造
填充属性:通过populateBean方法对bean内部的属性进行赋值填充,通常就是@Autowired注解的这些变量,通过三级缓存机制进行填充,也就是依赖注入
**初始化实例:**在属性填充后,通过initializeBean方法对实例初始化初始化的第一步是初始化相关容器的信息,通过invokeAwareMethods方法为实现了各种Aware接口的 Bean设置诸如beanName,beanFactory等容器信息,Aware接口代表信息感知接口,一旦实现了这些接口就可以在bean实例中感知并获取到对应的信息
之后通过invokeInitMethods方法执行bean的初始化方法,在执行初始化方法的前后都会处理各种bean的后置处理器,这些处理器包括负责处理AOP的AnnotationAwareAspectJAutoProxyCreator;负责构造后@Post
Construct和销毁前@PreDestory处理的InitDestoryAnnotationBeanPostProcessor等系统级处理器以及各种自定义bean处理器
注册销毁:为了实现bean优雅的销毁,通过注册销毁registerDisposableBean方法将实现了接口DisposableBean的bean进行注册,这样在销毁时就可以执行destory()方法了
通过以上四步我们就将bean创建好了,最后只需要将这些完整的bean对象通过addSingleton方法放入单例池singletonObjects中就可以被获取和使用了
销毁:
在销毁前要先执行"销毁前处理器"postProcessBeforeDestruction,这里就会执行bean中的@preDestory注解的方法,
然后通过destroyBeans方法逐一销毁我体内所有的bean,销毁时会执行destroy方法
在destroy方法 执行之后,还通过"客户端销毁方法"invokeCustomDestroyMethod 来执行在bean上自定义的destroyMethod方法
这样就有一套完整的bean生产到使用到销毁的流程的完整的生命周期