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

posted @ 2021-01-01 18:14  xxxxxxxxxxxxxxxd  阅读(132)  评论(0)    收藏  举报