要对a和b进行增强,增强的原理就是aop,jdk代理或者cglib代理。问题出在b.setA()的时候,b需要一个pa注入b而不是一个没有被增强的a,问题出在代理对象创建时机比较晚,而依赖注入的时机比较早。
引入三级缓存,factories.put()放入的是工厂对象,将来有可能产生代理,有可能产生原始对象。当执行b.setA()的时候,会去三级缓存中找工厂对象,然后工厂对象生成pa,把pa加入二级缓存,同时Bean b完成依赖注入,返回pb,然后bean a为了不重复创建代理对象,去二级缓存中检查代理对象pa是否生成,随即完成bean a的依赖注入。