提前申明:本文是基于spring.5.0.7.RELEASE
测试用例如下:
@Service("transactionServiceTest")
public class TransactionServiceTest implements TransactionService {
@Autowired
private UserManager2 userManager2;
}
@Component
public 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接着进行初始化。至此,循环依赖解决实现。
发表回复