Bean 的生命周期就是:实例化 → 属性赋值 → 初始化 → 使用 → 销毁。中间穿插着各种 Aware 接口回调 和 BeanPostProcessor 增强,BeanPostProcessor 是贯穿全局的"万能插槽"。
完整生命周期
1、通过BeanDefinition获取bean的定义信息
BeanDefinition = Bean 的"定义信息"或"图纸",描述了一个 Bean 该怎么造、造出来是什么样。
2、调用构造函数实例化bean(new 出空壳对象)
3、bean的依赖注入
4、处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware等)
Spring 检测 Bean 有没有实现某个 Aware 接口,如果实现了,就回调它对应的 setXxx() 方法,把容器资源塞进去。
Aware 接口:给 Bean 注入"容器资源"
Bean 平时只能 @Autowired 注入其他业务 Bean,但有时它需要拿到容器自身的东西,比如:
-
我叫什么名字?→
BeanNameAware -
我的工厂是谁?→
BeanFactoryAware -
整个应用上下文?→
ApplicationContextAware -
当前环境变量?→
EnvironmentAware
这些不能靠 @Autowired 拿到,必须实现对应接口,容器才会回调塞给你。Aware 机制就是让 Bean 实现对应的 XxxAware 接口,Spring 在 BeanPostProcessor 前置阶段通过 ApplicationContextAwareProcessor 判断并回调对应的 setXxx() 方法,把容器资源注入进去。不实现接口就拿不到。 常见的有 BeanNameAware、BeanFactoryAware、ApplicationContextAware、EnvironmentAware 等。
5、Bean的后置处理器(BeanPostProcessor)-前置
BPP-前置是 Bean 生命周期中初始化之前的一个扩展时机。Spring 会遍历容器里所有的 Bean 后置处理器(BeanPostProcessor),依次调用它们的 postProcessBeforeInitialization() 方法(初始化之前要执行的方法),对 Bean 做统一增强。
6、初始化方法(InitializingBean、init-method)
7、Bean的后置处理器BeanPostProcessor-后置 --》 AOP 代理在此生成
Spring 会遍历所有 BPP,调用它们的 postProcessAfterInitialization()(初始化之后要执行的方法)
620



被折叠的 条评论
为什么被折叠?



