spring bean的生命周期
spring bean的实例化经过了容器一系列繁琐的操作,包括实例化之前后,属性初始化前后留有相应的钩子
我们称这些关键的过程为bean在spring容器中的生命周期阶段
在分析每个生命周期时我们先给出一个序列图
spring bean的生命周期序列图
生命周期阶段详解
第一步:BeanFactoryPostProcessor的创建 容器启动之时首先会调用invokeBeanFactoryPostProcessors(beanFactory); 该方法加载并创建所有BeanFactoryPostProcessor的实现类。 Spring IoC容器允许BeanFactoryPostProcessor在容器实例化任何bean之前读取bean的BeanDefinition(配置元数据),并可以修改它。 同时可以定义多个BeanFactoryPostProcessor,通过设置'order'属性来确定各个BeanFactoryPostProcessor执行顺序 第二步:BeanFactoryPostProcessor的postProcessBeanFactory方法执行 调用BeanFactoryPostProcessor的postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法 该方法表示在任何bean被实例化之前,允许内部的BeanFactory修改bean的定义BeanDefinition 第三步:BeanPostProcessors的创建 容器启动之时首先会调用registerBeanPostProcessors(beanFactory); 方法加载并创建所有BeanPostProcessors的实现类 BeanPostProcessors称为bean的后置增强器,在bean被任何初始化方法之前(init)或之后提供回调方法 第四步:InstantiationAwareBeanPostProcessor的创建 同第二步一样,加载并实例化BeanPostProcessors的实现类,这一步由于BeanPostProcessors的直接实现类加载完毕, 但是还有一个InstantiationAwareBeanPostProcessor子接口也继承BeanPostProcessors, 所以这一步会加载并实例化InstantiationAwareBeanPostProcessor的实现类 InstantiationAwareBeanPostProcessor也是bean的后置增强器,它提供bean的实例化前后的回调方法 第五步:InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation执行 bean在实例化之前会检查容器有没有合适的InstantiationAwareBeanPostProcessor, 如果有就调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法 对bean的实例化之前做一个处理,如果为null则继续bean的创建过程,如果不为null, 则让InstantiationAwareBeanPostProcessor的子类有机会返回代理而不是目标bean实例 bean的实例化之前的回调 第六步:createBeanInstance执行bean的构造器 在doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)之中, 首先会进行createBeanInstance(beanName, mbd, args);操作所以这一步的主要是 调用bean的构造器创建bean的对象 第七步:InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation执行 populateBean(beanName, mbd, instanceWrapper);逻辑中在bean的setter注入之后,会调用bean的后只处理器,处理bean的属性, 这一步会调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation 该方法表示bean的实例化之后,要不要对bean的属性进行进一步的属性注入操作,如果返回false代表bean的实例化以及属性注入成功,一般会返回一个boolean值 所以这一步的主要是InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法 bean的实例化之后的回调 第八步:InstantiationAwareBeanPostProcessor的postProcessPropertyValues执行 调用postProcessPropertyValues方法 在bean的setter注入属性前判断有没有InstantiationAwareBeanPostProcessor对bean的属性做一些改变,如果没有则原样返回PropertyValues 第九步:bean的setter属性注入 在在doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)之中, populateBean(beanName, mbd, instanceWrapper);进行bean的属性注入操作, 所以这一步的主要是 调用bean的Setter进行属性的装配 第十步: 执行bean的Aware接口的方法 到这一步,bean的实例化以及bean的属性填充已经完毕,populateBean(beanName, mbd, instanceWrapper);执行完毕并退出 这一步进入 initializeBean(beanName, exposedObject, mbd);逻辑 所以这一步会调用invokeAwareMethods(beanName, bean);方法,如果bean实现了BeanNameAware,则会调用setBeanName(beanName)方法 接着判断如果bean实现了BeanClassLoaderAware则调用setBeanClassLoader(getBeanClassLoader())方法, 最后判断如果bean实现了BeanFactoryAware则调用setBeanFactory(beanFactory方法) 总结下,这一步主要是调用bean的一些列实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware的方法 第十一步: BeanPostProcessor的postProcessBeforeInitialization执行 调用BeanPostProcessor.postProcessBeforeInitialization方法 bean的初始化之前的回调 第十二步: InstantiationAwareBeanPostProcessor的postProcessBeforeInitialization执行 调用InstantiationAwareBeanPostProcessor的postProcessBeforeInitialization方法 bean的初始化之前的回调 第十三步: InitializingBean的afterPropertiesSet执行 调用InitializingBean.afterPropertiesSet方法 第十四步: bean的init-method执行 调用invokeCustomInitMethod(beanName, bean, mbd);方法,这一步调用客户配置的init-method方法 第十五步: BeanPostProcessor的postProcessAfterInitialization执行 调用 BeanPostProcessor的postProcessAfterInitialization bean CustomService 到这一步bean已经完成了实例化和bean的init初始化操作,在bean被返回之前有可能会有spring aop机制 如果存在aop的话这一步AbstractAutoProxyCreator会根据切面生成一个基于原始bean的一个代理对象 那么最终BeanFactory向外暴露的bean就是一个代理的bean 第十六步: InstantiationAwareBeanPostProcessor的postProcessAfterInitialization执行 调用 InstantiationAwareBeanPostProcessor的postProcessAfterInitialization,bean的初始化结束后的回调 第十七步: DisposableBean的destroy执行 调用 DisposableBean 的destroy()方法 第十八步: bean的destroy-method执行 调用 客户的bean中的destroy-method方法