[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:如果没有,就新建一个事务;如果有