Spring IoC 容器原理
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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!