提前申明:本文是基于spring.5.0.7.RELEASE

测试用例如下:

@Service("transactionServiceTest")public class TransactionServiceTest implements TransactionService {    @Autowired    private UserManager2 userManager2;}@Componentpublic class UserManager2 {    @Autowired    private TransactionServiceTest transactionServiceTest;}

图1
图2
图3

下面的图1、图2、图3别离示意我的项目启动后咱们的测试类的创立程序:
1.先创立TransactionServiceTest;
2.因为TransactionServiceTest依赖UserManager2,所以紧接着去创立UserManager2;

图4

图4的红色方框的栈线程信息,反映的是spring注入TransactionServiceTest类外面的UserManager2属性;

图5

图5反映的是spring创立UserManager2过程中发现其须要依赖TransactionServiceTest,而注入TransactionServiceTest属性的过程;最终调用了
DefaultSingletonBeanRegistry.getSingleton(beanName);

    public Object getSingleton(String beanName) {        //留神这里的allowEarlyReference 值 是ture        return getSingleton(beanName, true);    }

上面是getSingleton()具体逻辑:

protected Object getSingleton(String beanName, boolean allowEarlyReference) {        //因为此时TransactionServiceTest并没有实现初始化,因而 singletonObject = null;        Object singletonObject = this.singletonObjects.get(beanName);        if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {            synchronized (this.singletonObjects) {                singletonObject = this.earlySingletonObjects.get(beanName);                if (singletonObject == null && allowEarlyReference) {                    //最终在获取TransactionServiceTest对应的lamda表达式                    ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);                    if (singletonFactory != null) {                        //这里执行lamda表达式,获取singletonObject实例                        singletonObject = singletonFactory.getObject();                        this.earlySingletonObjects.put(beanName, singletonObject);                        //lambda表达式删掉                        this.singletonFactories.remove(beanName);                    }                }            }        }        //最终返回singletonObject实例        return singletonObject;    }

lambda表达式的逻辑如下:

protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {        Object exposedObject = bean;        if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {            for (BeanPostProcessor bp : getBeanPostProcessors()) {                if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {                    SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;                    //调用AutowiredAnnotationBeanPostProcessor.getEarlyBeanReference办法;                    //如果此时有必要被代理,也会在这里调用相应的后置处理器生成代理对象                    exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);                }            }        }        return exposedObject;    }

lambda表达式执行实现之后,生成一个晚期对象,为什么叫晚期对象呢?因为此时的bean对象还没有被执行初始化逻辑;

接下来,UserManager2执行初始化逻辑,初始化实现后,TransactionServiceTest接着进行初始化。至此,循环依赖解决实现。