Spring源码 IOC和循环依赖AOP
IOC篇
1、BeanFactory
IOC容器,以BeanFactory为载体。
BeanFactory,是Spring容器。这是由Spring管理,产生SpringBean生命周期的载体。
豆子的工厂,进厂打工,就得听工厂(Spring)的话。
与之相比较的是FacotryBean,就不是Spring管理,由道友们自己定义。FactoryBean,工厂豆子。
工厂的豆子,重点是豆子,所以自己做主。
BeanFactory 可以怎么用?
https://blog.csdn.net/China_eboy/article/details/115513512 (别人那里看到的)本人也没怎么用过。
2、IOC 控制反转
以下是IOC的介绍。IOC英语,Inversion of Control, 反转 of 控制,直译,控制反转。
我理解,IOC是为了把一些配置类,一些服务类,能够解放出来,交给Spring管理。
其中包括了注册和使用。
@Service @Autowired类似。
将xml,json,yml各种格式,都交给Spring解析。
其中IOC容器,经过增强器,实例化,具体经过两个过程,才会变成完整的对象。
3、Bean的实例化
实例化,大致有如下过程。
需要经过实例化和初始化!!
属性赋值,不仅仅是自定义属性赋值,还有继承Aware接口的,将会赋予Spring容器内有的特定值。
属性赋值,完成对象。初始化!!详细如下图。
这就是IOC,将bean交给IOC管理。
AOP,就是切面,如上图,用在了BeanPostProcessor 增强处理器,处理Bean上。
其中讲一个循环依赖的问题。
循环依赖和AOP篇
二级缓存就能够解决一般的循环依赖。
如上图,假设A,B两个Class互相引用。
public class A{
private B b;
}
public class B{
private A a;
}
这就是循环依赖。
但是加入了切面,AOP。二级缓存就不够用了。
三级缓存,是为了解决AOP。
AB循环依赖,时序图如下。
先存
三级缓存 先存 A ,再存A的属性bbb,引用B对象。所以再存B。
获取B的对象A。
B:aaa,ref = A
A移入二级缓存,移除三级缓存。 找到了bean A.
deepCopy.add(new PropertyValue(pv, convertedValue));
pv:"bean property 'aaa'"
BeanName zyB,B class完成
applyPropertyValues(beanName, mbd, bw, pvs);
返回出来
addSingleton
放入一级缓存,移除二级缓存,移除三级缓存。
添加registerdSingleton.add(beanName)
继续跳出到,bean = B。
把bean property
addSingleton(7个了 A 和 B)
放入一级缓存,移除二级缓存,移除三级缓存。
添加registerdSingleton.add(beanName)