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