Spring 的核心就是 IoC 容器。从 BeanDefinition 的定义到 Bean 的实例化,容器内部经历了什么?

一、IoC 的概念与优势

  • 1.1 控制反转——创建对象的权利交给容器
  • 1.2 DI 依赖注入——IoC 的具体实现方式
  • 1.3 IoC 容器解决了什么问题

二、BeanDefinition——Bean 的”配方”

  • 2.1 BeanDefinition 的元数据——scope / lazy-init / depends-on / init-method / destroy-method
  • 2.2 注册方式:XML → @Bean → @Component 扫描
  • 2.3 BeanDefinitionRegistry 的注册过程
  • 2.4 @Scope 的作用域类型——singleton / prototype / request / session

三、BeanFactory——最底层的容器

  • 3.1 BeanFactory 接口的核心方法——getBean()
  • 3.2 DefaultListableBeanFactory——默认实现
  • 3.3 懒加载机制——getBean() 时才创建

四、ApplicationContext——高级容器

  • 4.1 ApplicationContext 继承自 BeanFactory 的多个接口
  • 4.2 扩展功能——国际化、事件发布、资源加载
  • 4.3 常用实现:AnnotationConfigApplicationContext / ClassPathXmlApplicationContext

五、Bean 的生命周期

  • 5.1 实例化 → 属性赋值 → Aware 回调 → 初始化 → 就绪 → 销毁
  • 5.2 @PostConstruct@PreDestroy
  • 5.3 InitializingBean / DisposableBean 接口
  • 5.4 @Bean(initMethod = "init", destroyMethod = "destroy")

六、循环依赖的三级缓存

  • 6.1 什么是循环依赖——A 依赖 B,B 依赖 A
  • 6.2 三级缓存:singletonObjects / earlySingletonObjects / singletonFactories
  • 6.3 二级缓存为什么不够——AOP 代理的问题
  • 6.4 构造器循环依赖为什么无法解决
  • 6.5 @Lazy 的另一种解决方案

七、总结

  • BeanFactory 和 ApplicationContext 的区别与选型
  • 循环依赖的排查——BeanCurrentlyInCreationException