A {
@Autowried
B b;
}
B{
@Autowried
A a;
}
AService{
BService bservice;
}
BService{
AService aservice;
}
====条件
什么时候去将Aop提前?
出现了循环依赖的时候 我们才将Aop提前。
怎么去判断出现了循环依赖?
我们在后一个的属性填充的时候去判断最合适
new 产生一个对象
Bean=====好几个步骤
cto.newInstance()
AService class最终变为我们的一个bean对象
1、扫描 classbd
2、有一个Map能够标记我们这个Aservice正在创建ture // PostProcessor
2、实例化 对象 (1、工厂方式创建 2、构造函数,去反射)=原始对象=我们的三级缓存=将道理来说,我们只要将我们的原始对象放到这个三级缓存就行了,spring它不是这样做的
它是在我们的这个三级缓存中,存放的而是一个lambda表达式===只是说这个lambda表达式里面除了将我们的原始对象存进去之外,他还存放了其它的东西。
3、属性填充(PopularBean)=bservice=单例池找找不到创建bservice
4、初始化
5、最重要一个环节=Aop====初始化后 === postProcessor ===== AOP是一个独立的类 进行Aop就是去实现我们的PostProcessor
6、bean放入我们的单例池中去
==============================
Bservice class最终变为我们的一个bean对象
1、扫描 classbd
2、实例化 对象 (1、工厂方式创建 2、构造函数,去反射)=
3、属性填充(PopularBean)=aservice=单例池找找不到= 去三级缓存中去找 === 找到一个lambda表达式=执行我们lambda表达式的方法 拿到我们的原始对象=AopAservice的理对象1=放到我们
的二级缓存中去
4、初始化
5、最重要一个环节=Aop
$Cglib
6、bean放入我们的单例池中去=====如果说我们在第五步进行了Aop,那我们放入单例池中的这个对象是一个什么对象?就是我们的代理对象
解释一下什么是原始对象什么是代理对象
Cservice class最终变为我们的一个bean对象
1、扫描 classbd
2、实例化 对象 (1、工厂方式创建 2、构造函数,去反射)=
3、属性填充(PopularBean)=aservice=单例池找找不到=我们就从我们的二级缓存中找去三级缓存中去找 === 找到一个lambda表达式=执行我们lambda表达式的方法 拿到我们的原始对象=Aop代理对象2
4、初始化
5、最重要一个环节=Aop
$Cglib
6、bean放入我们的单例池中去=====如果说我们在第五步进行了Aop,那我们放入单例池中的这个对象是一个什么对象?就是我们的代理对象
解释一下什么是原始对象什么是代理对象
可以解决对象冲突
说白了就是可以解决如果在第五步进行了Aop,将你的代理对象放入单例池和我们熟悉填充中的对象不是同一个的问题====AbstractAutoProxyCreator.SmartInstantiationAwareBeanPostProcesso完成了我们的Aop
怎么解决?
Spring是将我们Aop提前了
我们什么时候把我们Aop去进行提前?
什么时候去将Aop提前?
出现了循环依赖的时候 我们才将Aop提前。
怎么去判断出现了循环依赖?
我们在后一个的属性填充的时候去判断最合适
===Hzkmap
三个map
我们口中所谓的三级缓存
一级缓存:单例池CMap<key,value>key:是beanName,value是bean对象SingletonObjects()
二级缓存:Map<key,valye>=keybeanName,value,是我们三级缓存产生的一个对象,如果说你进行了Aop,那么存放的就是我们的代理对象,反之,则是我们的原始对象。
三级缓存:Map==<key,value>=key=beanName,value===lambda表达式
至少还需要一个Map===creatingMap()
3883

被折叠的 条评论
为什么被折叠?



