循环依赖

1.简单对象间的循环依赖处理

2.AOP对象间的循环依赖处理

protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {   
Object exposedObject = bean;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
// 看到这个判断了吗,通过@EnableAsync导入的后置处理器
// AsyncAnnotationBeanPostProcessor根本就不是一个SmartInstantiationAwareBeanPostProcessor
// 这就意味着即使我们通过AsyncAnnotationBeanPostProcessor创建了一个代理对象
// 但是早期暴露出去的用于给别的Bean进行注入的那个对象还是原始对象
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {   
         SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;  
          exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);       
  }     
 }   
}
return exposedObject;
}


早期暴露的对象跟最终放入容器中的对象不是同一个,所以报错了
需要加@Lazy这个注解的作用在于,当为B注入A时,会为A生成一个代理对象注入到B中,当真正调用代理对象的方法时,底层会调用 getBean(a) 去创建A对象,然后调用方法,这个注解的处理时机是在 org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveDependency 方法中,处理这个注解的代码位于 org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver#buildLazyResolutionProxy

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容