需求与问题
核⼼的诉求
- 现存系统,不打算重构
- Spring 版本3.x,不打算升级版本和引⼊ Spring Boot
- 期望能够在少改代码的前提下实现⼀些功能增强
⾯临的问题
- 3.x 的 Spring 没有条件注解
- ⽆法⾃动定位需要加载的⾃动配置
核⼼解决思路
条件判断
- 通过 BeanFactoryPostProcessor 进⾏判断
配置加载
- 编写 Java Config 类
- 引⼊配置类
- 通过 component-scan
- 通过 XML ⽂件 import
Spring 的两个扩展点
BeanPostProcessor
- 针对 Bean 实例
- 在 Bean 创建后提供定制逻辑回调
BeanFactoryPostProcessor
- 针对 Bean 定义
- 在容器创建 Bean 前获取配置元数据
- Java Config 中需要定义为 static ⽅法
关于 Bean 的⼀些定制
Lifecycle Callback
- InitializingBean / @PostConstruct / init-method
- DisposableBean / @PreDestroy / destroy-method
XxxAware 接⼝
- ApplicationContextAware
- BeanFactoryAware
- BeanNameAware
⼀些常⽤操作
判断类是否存在
- ClassUtils.isPresent()
判断 Bean 是否已定义
- ListableBeanFactory.containsBeanDefinition()
- ListableBeanFactory.getBeanNamesForType()
注册 Bean 定义
-
BeanDefinitionRegistry.registerBeanDefinition()
- GenericBeanDefinition
- BeanFactory.registerSingleton()