提前申明:本文是基于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接着进行初始化。至此,循环依赖解决实现。