Spring Advance Features
Spring 高级特性的学习整理笔记。
IoC
- 依赖注入(Dependency Injection,DI), 这是 IoC 最常见以及最合理的实现方式
- 依赖查询,通过 Bean 容器来根据类型或者名称查找相对应的 Bean。
IoC 容器:
- BeanFactory,基础容器
- ApplicationContext,应用级容器,基于 BeanFactory 扩展了更多的功能
- 资源访问
- 国际化
- 事件
注入的方法:
- (推荐) 构造注入,保证注入的组件不可变 final,并且确保需要的依赖不会为空。
- setter 注入
- 基于注解的注入
@Autowired,Spring自带的注解,默认是根据类型进行装配- 如果有多个类型一样的候选者,需要配合
@Qualifier指定名称进行装配
- 如果有多个类型一样的候选者,需要配合
@Resource,JSR250规范定义的,默认根据属性名称进行装配@Inject,JSR330规范定义的,默认根据类型进行装配的; 配合@Named可以按名称进行装配
Bean 生命周期
- 实例化 Instantiation,构造函数调用后生成的实例被包装成 ObjectFactory
放入第三级缓存
- 构造注入
- 属性赋值 Populate
- set 注入
- 注解注入
- 初始化 Initialization
- xxxAware 接口
- BeanPostProcess
- InitializingBean
- 销毁 Destruction
- DisposableBean
循环依赖问题
Spring只是解决了单例模式下 setter 注入的循环依赖问题,无法解决构造注入的循环依赖问题。
解决循环依赖主要是依赖三级缓存,而 Bean 只有在调用构造方法之后,才会被包装成 ObjectFactory 放入第三级缓存, 因此如果 Bean 没有完成构造方法,那么其他的 Bean 并不能从三级缓存中获取到该依赖的 Bean,也就不能解决依赖问题。
对于构造注入的循环依赖问题,往往是因为设计上的不合理,需要调整接口的调用顺序以及梳理层级调用关系。
三级缓存
- 第一级缓存(singletonObjects),存放最终形态的 Bean(已经实例化、属性填充、初始化)
- 第二级缓存(earlySingletonObjects),存放过渡 Bean(实例化后的半成品,尚未属性填充以及初始化)
- 第三级缓存(singletonFactories),在调用 bean
的构造方法后,将实例包装成
ObjectFactory,放入这里