spring bean生命周期
Bean的生命周期:
class--->BeanDefinition----BeanFactoryPostProcessor-->new UserService()--->填充属性--->Aware--->初始化--->aop--->单例池(map<beanName, Object>)
1. beanClass--->User
2. scope
BeanFactory组建完成
beanDefinitionMap--->ConcurrentHashMap<beanDefinitionName, BeanDefinition>
beanDefinitionName
singletonObject
beanPostProcessor
BeanFactoryPostProcessor
Mybatis 代理对象--->bean
1. UserMapper ---> new MyFactoryBean(UserMapper.class)--->UserMapper代理对象
2. OrderMapper---> new MyFactoryBean(OrderMapper.class) --->orderMapper代理对象
bd = new BeanDefinition()
bd.beanClass = MyFactoryBean
bd.beanName = userMapper
bd.ConstructorArgumentValues.add(UserMapper.class)
new MyFatoryBean()
bean--->UserMapper代理对象
bd = new BeanDefinition()
bd.beanClass = MyFactoryBean
bd.beanName = orderMapper
bd.ConstructorArgumentValues.add(OrderMapper.class)
new MyFatoryBean()
bean--->OrderMapper代理对象
2. spring 三级缓存解决循环依赖
0. creatingSet<aService>
1. 实例化--->AService不完整对象(new AService())原始对象--->第三级缓存<'aService', lamda(AService原始对象, beanName, BeanDefinition)>
2. 填充bService属性--->从单例池找bService--->找不到--->创建bService
bService Bean的生命周期
2.1 实例化--->BService不完整对象(new BService())原始对象--->第三级缓存<'bService', lamda(bService原始对象, beanName, BeanDefinition)>
2.2 填充aService属性--->从单例池找aService--->找不到--->aService正在创建中--->aService出现循环依赖--->从第三级缓存中取aService出来执行lamda表达式--->提前aop--->AService代理对象--->第二级缓存<'aService', AService代理对象>
2.3 填充其他属性
2.4 做其他事情
2.5 放入单例池
3. 填充其他属性
4. 做其他事情
5. 从第二级缓存取出AService代理对象
6. 放入单例
7. creatingSet.remove('aService')
备注:
只有出现循环依赖才需要提前进行aop
AService代理对象的bService属性没有值,AService代理对象的某个属性指向的bService属性才有值 (因为bService属性填充在aop之前)
spring 三级缓存:
第一级缓存:singletonObject ConcurrentHashMap<beanName, bean对象> ---> 保证单例
第二级缓存:earlySingleObject HashMap<beanName, bean对象> ---> 保证aop产生的对象都是单例
第三级缓存: singletonFactory HashMap<beanName, ObjectFactory(lamda表达式)> ---> 判断是否需要进行aop
creatingSet: 判断是否产生循环依赖
因为从第二级缓存取对象存第三级缓存,或者从第三级缓存取对象存第二级缓存加锁,不存在并发安全,所以使用的是HashMap

浙公网安备 33010602011771号