脱离spring环境
什么是:
循环依赖就是有两个类,A,B,在创建A的时候,给A里放个B,创建B的时候,给B里放个A,无限调用对方,
解决:
实例化和填充属性分开,先实例化,再填充属性
spring环境下
一级缓存
一实例化对象直接放进单例池。一个单例池已经能够解决循环依赖,但是,在多线程的情况下,会出现其他线程会拿走半成品的情况
解决方法:1半成品加锁,2判断属性是否填充,没有填充属性的半成品不能使用,
二级缓存
会有一个提前暴露池,一个单例池,半成品会放到提前暴露池,,当另一个线程来取时,只会到单例池中取 ,找不到就直接返回,不会用到半成品,在完成填充属性后,将提前暴露池里的半成品删掉,将成品放到单例池中,解决循环依赖,但是二级缓存也有问题,二级缓存注入属性时,没有注入代理,当对象需要切面时,切面就不能注入
最终解决:三级缓存:
三级缓存里会有半成品和一个工厂,在注入之前,会先加工成代理再注入,是将最后几步的创建代理提前进行