循环依赖

2023-04-16  本文已影响0人  菊地尤里

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

上一篇 下一篇

猜你喜欢

热点阅读