Spring生命周期补充

[Bean的生命周期]
createBean(beanName, mbd, args);

1. InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation  解析AOP相关 , 这里可以拦截Bean,使用我们自己创建的Bean
2. SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors 选择构造器
---- 开始创建对象
3. autowireConstructor(beanName, mbd, ctors, null) or instantiateBean(beanName, mbd) 创建最原始的对象,没有任何属性的对象

4. MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition  处理AutoWired value 预解析
5. 将原始的bean和beanDefinition 以及BeanName 放入三级缓存,用来解决循环依赖 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
6. SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference 获得早期暴露对象
---- 开始属性赋值
7. InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation  提供可以修改Bean状态的后置处理,可以支持属性注入的方式
8. PropertyValues 属性值确认
9. InstantiationAwareBeanPostProcessor#postProcessPropertyValues 可以修改属性的值
10. applyPropertyValues(beanName, mbd, bw, pvs); 开始真正的属性赋值
---- 初始化Bean
11. initializeBean
12. 调用Aware methods invokeAwareMethods
 BeanNameAware
 BeanClassLoaderAware
 BeanFactoryAware
12. BeanPostProcessor#postProcessBeforeInitialization 处理 @PostContruct    
13. invokeInitMethods(beanName, wrappedBean, mbd); 调用初始化方法 init-method
14. BeanPostProcessor#postProcessAfterInitialization AOP创建代理, 事务等都是这里实现的

15. DestructionAwareBeanPostProcessor#requiresDestruction


[Spring三级缓存解决循环依赖]
0. creatingSet<aService>
1. 实例化--> 不完整的对象--> 放入三级缓存<'aService',lambda(AServicec原始对象,beanName,beanDefinition>)
2. 填充属性bService --> 从单例池中查找 --> 找不到 --> 创建bService
 2.1 实例化 -- nService对象(new BService())
 2.2 填充aService属性 --> 从单例池中查找 --> 找不到 --> AService 正在创建 --> AService出现循环 --> 从二级缓存查找 --> 从三级缓存拿取 --> 执行lambda --> 提前AOP --> AService 代理对象
 --> 存放二级缓存<'aService',AService 代理对象>
 2.3 填充其他属性
 2.4 做其他的事情
 2.5 放入单例池

3. 填充其他属性
4. 做其他的事情 -->  AOP --> 原始对象被代理 --> AService 代理对象
4.5 从二级缓存取出AService代理对象
5. 放入单例池
6. creatingSet.remove('aService')

[事务的传播特性]
PROPAGATION_REQUIRED:默认事务类型,如果没有,就新建一个事务;如果有,就加入当前事务。适合绝大多数情况。
PROPAGATION_SUPPORTS:如果没有,就以非事务方式执行;如果有,就使用当前事务。
PROPAGATION_REQUIRES_NEW:如果没有,就新建一个事务;如果有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十二月的雪7

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值