Spring Boot - IOC(四) - 循环依赖与解决方案
1. 编写测试代码
@Component
public class Person {
@Autowired
Cat cat;
}
@Component
public class Cat {
@Autowired
Person person;
}public class App {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("com.example.demo.component");
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
Stream.of(beanDefinitionNames).forEach(System.out::println);
}
}2. 流程全分析 - 初始化IOC容器
2.1 new AnnotationConfigApplicationContext
2.2 refresh
2.3 finishBeanFactoryInitialization
2.4 DefaultListableBeanFactory#preInstantiateSingletons
3. 流程全分析 - 初始化Cat
3.1 doGetBean(cat)
3.2 【重要】getSingleton
3.3 createBean(cat)
3.4 doCreateBean(cat) & createBeanInstance

3.5 earlySingletonExposure的判断 & addSingletonFactory
3.6 populateBean(cat)
3.7 AutowiredAnnotationBeanPostProcessor#postProcessProperties
3.8 【注入】metadata.inject
3.9 beanFactory.resolveDependency
3.10 doResolveDependency
4. 流程全分析 - 初始化Person
4.1 getBean(person)
4.2 doGetBean(person) - getSingleton(person)

4.3 createBean(person) - doCreateBean(person) -> addSingletonFactory
4.4 populateBean(person)
4.5 metadata.inject - resolveDependency - doResolveDependency
4.6 再次getBean(cat)
4.7 【二次获取】getSingleton(cat)

4.8 回到doGetBean(cat)
4.9 getObjectForBeanInstance(cat)
4.10 AbstractBeanFactory#getObjectForBeanInstance(cat)
4.11 再回到doGetBean(cat)
4.12 回到注入的部分(person)
4.13 回到resolveDependency(person)
4.14 返回inject方法(person)

4.15 回到doCreateBean(person)
4.16 回到createBean(person)
4.17 回到DefaultSingletonBeanRegistry#getSingleton(person)
4.18 afterSingletonCreation
4.19 【重要】addSingleton
5. 回到Cat的创建
5.1 回到DependencyDescriptor#resolveCandidate(cat)
5.2 返回注入的部分(cat)
5.3 回到resolveDependency(cat)
5.4 返回inject方法(cat)
5.5 回到doCreateBean(cat)
5.6 回到createBean(cat)
5.7 回到DefaultSingletonBeanRegistry#getSingleton(cat)
5.8 afterSingletonCreation
5.9 【重要】addSingleton
6. @Autowired解决循环依赖的核心思路

最后更新于