Spring的Bean生命周期
2022-04-18 00:12:47 0 举报
AI智能生成
spring的源码解析2
作者其他创作
大纲/内容
Bean的生命周期
对象的生命周期
代码入口
org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization里面的getBean
博客链接起点
https://blog.csdn.net/xiaojie_570/article/details/104729317
本质为调用doGetBean
流程图
功能一
转换对应 beanName
功能二
尝试从缓存中加载单例
三级缓存
循环依赖
prototype 原型 bean循环依赖(⽆法解决)
单例bean产生的循环依赖
构造器注入循环依赖(无法解决)
setter注入循环依赖
通过setXxx或者 @Autowired⽅法才能解决循环依赖
解决方案
流程图
关键词解释
一级缓存
singletonObjects
singletonObjects
用于存储被完整创建了的bean。也就是完成了初始化之后,可以直接被其他对象使用的bean。
二级缓存
earlySingletonObjects
earlySingletonObjects
用于存储提前暴露的Bean。
三级缓存
singletonFactories
singletonFactories
三级缓存存储的是工厂对象
因为三级缓存不是针对不同的循环依赖,而是针对有动态代理的循环依赖,同样是在填充属性阶段,如果依赖的是动态代理的对象,那么,我们需要提前暴露的就不是原来刚实例化的对象,而是这个对象的动态代理对象。但是,创建动态代理的成本是很高的,因此,我们使用工厂方法,在真正要获取动态代理对象的时候才去创建对象,将这种开销比较大的任务尽量延迟做,能尽量保证我们的性能。
参考链接:https://blog.csdn.net/x18423118112/article/details/122600382
根据【功能二】返回的结果进行
能加载待Bean
不能加载到Bean
功能三
只有singleton情况下才会尝试解决循环依赖
功能五
将创建的Bean加入到beanFactory的alreadyCreated属性中
功能四
功能六
BeanDfinitiaon定义公共的抽象累是AbstractBeanDefinition。
普通的Bean在Spring注册BeanDefinition的时候,实例化出来的是GenericBeanDefinition
Spring内置的Bean在注册BeanDefinition的时候,实例化出来的是RootBeanDefinition,
这时候,就要用getMergedLocalBeanDefinition将所有的BeanDefinition都转换为RootBeanDefinition
功能七
若当前Bean有依赖,则先创建依赖Bean
功能八
针对不同的scope进行bean的创建
【Singleton】类型
代码
具体功能
【处理与缓存就有关的事情(处理缓存是为了依赖),
创建Bean】
【处理与缓存就有关的事情(处理缓存是为了依赖),
创建Bean】
功能一
又检查了一次缓存中是否已经加载过名字为beanName的Bean
如果没有加载过,下面开始加载
如果加载过,就直接返回缓存中该的Bean
如果没有加载过,下面开始加载
如果加载过,就直接返回缓存中该的Bean
如果这个Bean正在被销毁,就抛异常
功能二
加载单例bean之前记录加载状态
记录异常的异常链
功能三
处理缓存和创建Bean
功能一
检查缓存中是否已经加载过该Bean
若没有加载,进行下面【功能二】-【功能五】的操作
若已经加载,直接返回加载好的Bean,就不用创建了
功能二
加载单例钱记录加载状态(方便循环依赖)
功能三
开始创建Bean,调用了getSingleton->createBean方法
功能一
根据设置的class属性或者根据className来解析Class
功能二
处理ovverride属性
功能三
应用初始化前的后处理器(第一个Spring的后处理器扩展点!!)
若这一步后处理返回了代理的Bean则不会执行【功能四】,若没有返回则执行【功能四】
resolveBeforeInstantiation方法主要工作:
判断当前beanFactory是否有InstantiationAwareBeanPostProcessor类型的后置处理器,如果有往下走
bean不为null才继续执行applyBeanPostProcessorsAfterInitialization方法,注意这个方法是XXX【Initialization】方法,即bean的初始化后处理方法,即使后面的创建Bean方法(doCreateBean)不能执行了,但Spring还是让我们执行了初始化后处理的方法。
bean为空则直接返回bean
applyBeanPostProcessorsBeforeInstantiation
前置处理器的切入点
前置处理器的切入点
首先获取beanFactory中所有的后置处理器,然后依次执行每个BeanPostProcessor的postProcessBeforeInstantiation方法,若方法返回非null则直接返回,不会执行后面的BeanPostProcessor。
applyBeanPostProcessorsAfterInitialization
后置处理器的切入点
后置处理器的切入点
如果beanFactory中有InstantiationAwareBeanPostProcessors那么就执行所有的BeanPostProcessor的postProcessBeforeInstantiation方法,按照顺序执行,只要有一个BeanPostProcessor的postProcessBeforeInstantiation方法返回值不为空,那么剩下的BeanPostProcessor的postProcessBeforeInstantiation方法都不用执行了,直接返回。
postProcessBeforeInstantiation的返回值
不为空
执行beanFactory中的postProcessAfterInitialization方法。
为空
不执行beanFactory中的postProcessAfterInitialization方法。开始往下执行创建Bean
InstantiationAwareBeanPostProcessor 实现类例子
AutowiredAnnotationBeanPostProcessor
在这里不执行(在createBeanInstance之后执行)
解析的注解
@Autowire
@Value
@Inject
AnnotationAwareAspectJAutoProxyCreator
实现AOP功能,在这里执行
解析的注解
@Aspect
CommonAnnotationBeanPostProcessor
在这里不执行(在createBeanInstance之后执行)
解析的注解
@PostConstruct
@PreDestroy
javax.annotation包下的JSR-250注解:@Resource注解
功能四
调用doCreateBean创建Bean
功能一
如果是单例,则需要首先清除缓存,然后再开始创建
功能二
实例化Bean
际上就是根据不同的策略来实例化Bean实例
instantiateUsingFactoryMethod工厂方法策略
若在配置类中通过@Bean注解来注册Bean
determineConstructorsFromBeanPostProcessors方法解析构造函数后通过autowireConstructor构造函数注入策略
若在类中的构造函数上标注了@Autowired属性会走这个方法,且该类是通过@Service、@Repository注册到容器中的
instantiateBean
使用无参的构造函数
功能三
第二个BeanPostProcessor
@Autowired 和 @Value注解就是再这里被解析的
applyMergedBeanDefinitionPostProcessors方法主要工作
该方法会执行MergedBeanDefinitionPostProcessor类型的后置处理器的postProcessMergedBeanDefinition方法
MergedBeanDefinitionPostProcessor实现类的例子
AutowiredAnnotationBeanPostProcessor
被执行
解析的注解
@Autowire
@Value
@Inject
CommonAnnotationBeanPostProcessor
被执行
解析的注解
@PostConstruct
@PreDestroy
javax.annotation包下的JSR-250注解:@Resource注解
功能四
依赖处理
【条件一】mbd.isSingleton()
:此RootBeanDefinition是否是单例
【条件二】this.allowCircularReferences
:beanFactory是否允许循环依赖。默认:允许(true)
【条件三】isSingletonCurrentlyInCreation
该Bean是否在创建中
会有一个专门的属性默认为DefaultSingletonBeanRegistry的singletonCurrentlyInCreation来记录Bean的加载状态
属性的记录
getSingleton的【功能二】
getSingleton的【功能四】
功能五
属性填充
功能六
调用初始化方法initializeBean 初始化
功能一
激活Aware方法
Spring中代表容器的beanFactory我们普通类是无法得到的,因为他是一个内部类。如果想要得到,我们需要增加一些操作。
功能二
应用所有BeanPostProcessor的postProcessBeforeInitialization方法
功能三
调用用户自定义的initMethod或者afterPropertiesSet方法
功能四
应用所有BeanPostProcessor的postProcessAfterInitialization方法
功能七
解决循环依赖问题
功能八
注册DisposableBean
功能四
移除缓存中针对该Bean的正在加载状态的记录
功能五
将结果记录至缓存并删除加载Bean过程中所记录的各种辅助状态
功能四
移除缓存中对该Bean正在加载状态的记录。与【功能二】beforeSingletonCreation 对应
功能五
将结果记录到缓存,并删除加载Bean过程中所记录的各种辅助状态
代码
【Prototype】类型
【其他Scope】类型
功能九
0 条评论
下一页