写在前面
私以为自己对于spring的循环依赖理解的已经很不错了,直到前段时间遇到了一个让我思考了良久的问题,即“循环依赖所注入的实例竟不是容器中的实例”。于是又从头仔细撸了一遍源码,才最终找到原因。因为我觉的整个过程涉及到的知识点还蛮多的,所以准备用6-7篇来针对“循环依赖所注入的实例竟不是容器中的实例”这个问题进行剖析。
问题引出
废话不多说,先来看看这个问题是什么?
有两个Service具有循环引用关系,分别是ServiceA和ServiceB,如下。
ServiceA.class
@Service
public class ServiceA {
@Autowired
// 可能有人会疑问,为何定义成public还要再写get方法,这个我们后面的文章会说,先卖个关子
public ServiceB serviceB;
@Async
public String process() {
return "success";
}
public ServiceB getServiceB() {
return serviceB;
}
}
ServiceB.class
@Service
public class ServiceB implements ApplicationContextAware {
public ServiceA serviceA;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, ServiceA> beansOfType = applicationContext.getBeansOfType(ServiceA.class);
serviceA &#