1.簡單對象間的循環(huán)依賴處理
2.AOP對象間的循環(huán)依賴處理
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
// 看到這個判斷了嗎姥宝,通過@EnableAsync導入的后置處理器
// AsyncAnnotationBeanPostProcessor根本就不是一個SmartInstantiationAwareBeanPostProcessor
// 這就意味著即使我們通過AsyncAnnotationBeanPostProcessor創(chuàng)建了一個代理對象
// 但是早期暴露出去的用于給別的Bean進行注入的那個對象還是原始對象
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
}
}
}
return exposedObject;
}
早期暴露的對象跟最終放入容器中的對象不是同一個茵肃,所以報錯了
需要加@Lazy這個注解的作用在于蒂萎,當為B注入A時同欠,會為A生成一個代理對象注入到B中,當真正調(diào)用代理對象的方法時调煎,底層會調(diào)用 getBean(a) 去創(chuàng)建A對象镜遣,然后調(diào)用方法,這個注解的處理時機是在 org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveDependency 方法中汛蝙,處理這個注解的代碼位于 org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver#buildLazyResolutionProxy