1、Bean生命周期
实例化、属性赋值、初始化、使用、销毁
分两种情况
1、容器初始化
1、构造方法
2、Aware(BeanNameAware-->BeanFactoryAware-->-->ApplicationContextAware)
3、InitializingBean
4、InstantiationAwareBeanPostProcessor(Instantiation)
5、BeanPostProcessor(Initialization)
2、Bean加载
实例化部分
1、postProcessBeforeInstantiation(Instantiation)
2、构造方法
3、postProcessAfterInstantiation(Instantiation)
4、postProcessPropertyValues
注入属性部分
5、BeanNameAware
6、BeanFactoryAware等等Aware
初始化部分
7、postProcessBeforeInitialization
8、init-method
9、afterPropertiesSet
10、postProcessAfterInitialization
使用
销毁
11、destory-method
12、destory(DisposableBean)
实现了这些接口的Bean会切入到多个Bean的生命周期中。正因为如此,这些接口的功能非常强大,Spring内部扩展也经常使用这些接口,例如自动注入以及AOP的实现都和他们有关。
这一大类接口的特点是功能丰富,常用于用户自定义扩展。
第二大类中又可以分为两类:
Aware类型的接口的作用就是让我们能够拿到Spring容器中的一些资源。基本都能够见名知意,Aware之前的名字就是可以拿到什么资源,例如BeanNameAware
可以拿到BeanName,以此类推。调用时机需要注意:所有的Aware方法都是在初始化阶段之前调用的!
Aware接口众多,这里同样通过分类的方式帮助大家记忆。
Aware接口具体可以分为两组,至于为什么这么分,详见下面的源码分析。如下排列顺序同样也是Aware接口的执行顺序,能够见名知意的接口不再解释。
Aware Group1
Aware Group2
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {}
这里涉及到另一道面试题,ApplicationContext和BeanFactory的区别,可以从ApplicationContext继承的这几个接口入手,除去BeanFactory相关的两个接口就是ApplicationContext独有的功能,这里不详细说明。
Spring Bean的生命周期分为四个阶段
和多个扩展点
。扩展点又可以分为影响多个Bean
和影响单个Bean
。整理如下:
四个阶段
多个扩展点
原文:https://www.cnblogs.com/anhaogoon/p/13153251.html