Spring IOC源码笔记-SpringBean的生命周期

spring bean的生命周期

spring bean的实例化经过了容器一系列繁琐的操作,包括实例化之前后,属性初始化前后留有相应的钩子

我们称这些关键的过程为bean在spring容器中的生命周期阶段

在分析每个生命周期时我们先给出一个序列图

spring bean的生命周期序列图

45c612b71b6d65da4a238c179f2c3c82b73.jpg

生命周期阶段详解

第一步: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方法

转载于:https://my.oschina.net/u/2993045/blog/3018951

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值