一、初识Aware:Bean的主动感知
Aware的字面魔法:
Aware(感知)接口是Spring留给Bean的特殊通道。当Bean实现了某个Aware子接口,就相当于举起了手说:"我需要知道XXX信息"。Spring容器会在合适的时机,通过这个接口把Bean需要的资源"递"到它手中。
常见Aware接口:
BeanNameAware:感知自己的Bean名称(工牌编号)BeanFactoryAware:感知创建自己的工厂(咖啡机操作手册)ApplicationContextAware:感知整个容器(店铺平面图)EnvironmentAware:感知环境变量(店铺温湿度)
(代码示例:ApplicationContextAware的使用)
public class CoffeeMaker implements ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext ctx) {
this.context = ctx; // 容器主动注入上下文
}
}
二、生命周期中的关键先生:BeanPostProcessor
后置处理器的双截棍:
BeanPostProcessor是Spring提供的一个扩展接口,它有两个关键方法:
postProcessBeforeInitialization:在Bean初始化前介入postProcessAfterInitialization:在Bean初始化后介入
(比喻:就像咖啡师在冲泡咖啡前后的检查工序)
处理Aware接口的幕后英雄:
Spring通过ApplicationContextAwareProcessor这个内置处理器,在Bean初始化前检查是否实现了Aware接口,并完成对应资源的注入。
三、Bean的诞生之旅:关键步骤拆解
让我们用时序图理解整个过程:
[Bean实例化] → [属性注入] → [Aware接口注入] → [BeanPostProcessor前置处理]
→ [@PostConstruct] → [InitializingBean] → [init-method]
→ [BeanPostProcessor后置处理] → [使用期] → [销毁流程]
关键阶段详解:
- Aware注入阶段:发生在属性注入之后,初始化方法之前
- 后置处理器介入:每个Bean都要经过所有BeanPostProcessor的处理
- 顺序保障:Aware接口的处理优先级最高,确保后续步骤能使用这些资源
四、设计哲学:为什么需要显式感知?
- 控制反转的边界:Spring不希望把容器所有能力都暴露给Bean
- 职责分离:Bean需要主动声明自己需要什么(接口即契约)
- 灵活性:允许容器在运行时动态决定注入策略
(现实案例:通过EnvironmentAware获取不同环境的配置参数)