Spring Bean生命周期

#博学谷IT学习技术支持#

Bean的生命周期:

在这里插入图片描述

1、首先会遍历之前加载过的beanDefinitionNames,然后beanDefinitionName获取RootBeanDefinition,判断是否为抽象类,单例,是否懒加载。

2、判断是否为FactoryBean,如果不为FactoryBean,执行正常的创建流程,调用getBean()方法,最后到AbstractBeanFactory的doGetBean()方法。内部逻辑比较复杂。

3、开始正式执行bean的加载操作,首先会调用getSingleton方法尝试获取bean实例,因为可能会存在循环依赖等其他问题,所以spring获取bean实例的时候是有三级缓存的(DefaultSingletonBeanRegistry)。

4、如果获取到bean对象,就对bean进行处理然后直接返回,否则进行初始化bean。

5、在创建bean之前,检测该bean是否存在依赖的bean,如果有的话,先初始化被依赖的bean。

6、在初始化bean的过程中,会首先执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()方法,spring原生注释是这样的:让BeanPostProcessors有机会返回一个代理而不是目标bean实例。

7、开始调用doCreateBean()方法,开始实例化bean对象,使用反射来创建一个原生的对象。

8、前面讲到,第一步spring会根据beanDefinitionName获取RootBeanDefinition,并在之前这一段过程中,又对RootBeanDefinition进行了处理,然后开始调用MergedBeanDefinitionPostProcessor的postProcessMerged-BeanDefinition方法。这个后置处理器在spring中的原生注释是:允许后处理器修改合并的bean定义。
也就是当前的RootBeanDefinition是在初始化bean之前最终的BeanDefinition,我们可以通过这个后置处理器对BeanDefinition做一些处理操作。

9、执行完MergedBeanDefinitionPostProcessor后置处理器后,开始判断是否允许循环依赖

boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));

有三个判断,①是否是单例,②是否允许循环依赖,③单例是否正在创建,由此可见,我们可以通过修改allowCircularReferences属性来决定是否允许循环依赖。

10、创建完对象后,开始调用populateBean()装配bean的属性。

1、首先开始调用 InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation()方法。
2、获取自动装配的模式和需要被自动装配的属性(自动装配的模式包括,AUTOWIRE_BY_NAME,和AUTOWIRE_BY_TYPE)。这个只是在xml配置的,是用@Autowire注解的注入是后置处理器进行处理的
3、然后继续调用InstantiationAwareBeanPostProcessor的postProcessProperties()和postProcessPropertyValues()方法。
4、调用initializeBean()方法开始初始bean,执行invokeAwareMethods()方法去为实现了BeanNameAware,BeanClassLoaderAware和BeanFactoryAware接口的bean注入对应的对象属性;
5、在调用初始化方法之前,会先调用BeanPostProcessor的postProcessBeforeInitialization()方法。
6、调用初始化方法,主要分为两个步骤,第一步是如果bean实现了InitializingBean接口的话,会调用InitializingBean的afterPropertiesSet()方法。然后会调用自定的initMethod进行初始化操作。
7、最后会调用BeanPostProcessor的postProcessAfterInitialization()方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值