提前声明:本文基于spring.5.0.7.RELEASE测试用例如下:@Service("transactionServiceTest")publicclassTransactionServiceTestimplementsTransactionService{@AutowiredprivateUserManager2userManager2;}@ComponentpublicclassUserManager2{@AutowiredprivateTransactionServiceTesttransactionServiceTest;}Figure1Figure2Figure3上面的图1、图2、图3分别代表了项目启动后我们的测试类的创建顺序:1、先创建TransactionServiceTest;2、因为TransactionServiceTest依赖于UserManager2,所以接下来创建UserManager2;图4中红框内的栈线程信息,图4反映了spring注入到TransactionServiceTest类中的UserManager2属性;图5图5反映了spring创建UserManager2发现需要依赖TransactionServiceTest,注入TransactionServiceTest属性;最后调用DefaultSingletonBeanRegistry.getSingleton(beanName);publicObjectgetSingleton(StringbeanName){//注意这里的allowEarlyReference值为truereturngetSingleton(beanName,true);}下面是getSingleton()的具体逻辑:protectedObjectgetSingleton(StringbeanName,booleanallowEarlyReference){//因为此时TransactionServiceTest没有结束进入初始化,所以singletonObject=null;对象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实例returnsingletonObject;}lambda表达式的逻辑如下:protectedObjectgetEarlyBeanReference(StringbeanName,RootBeanDefinitionmbd,Objectbean){ObjectexposedObject=bean;如果(!mbd.isSynthetic()&&hasInstantiationAwareBeanPostProcessors()){对于(BeanPostProcessorbp:getBeanPostProcessors()){如果(bpinstanceofSmartInstantiationAwareBeanPostProcessor){SmartInstantiationAwareBeanPostProcessoribp=(SmartInstantiationAwareBeanPostProcessor)bp;//调用AutowiredAnnotationBeanPostProcessor.getEarlyBeanPostProcessoribp=(SmartInstantiationAwareBeanPostProcessor)bp;对应的后处理器生成代理对象exposedObject=ibp.getEarlyBeanReference(exposedObject,beanName);}}}返回exposedObject;}lambda表达式执行后,会生成一个早期对象。为什么它被称为早期对象?因为此时的bean对象还没有执行初始化逻辑;接下来,UserManager2执行初始化逻辑,初始化完成后,Tr然后ansactionServiceTest初始化到此,循环依赖处理完成。
