文章目录
什么是Bean
的生命周期
在Spring
框架中,Bean
的生命周期是指一个Spring
容器中Bean
从创建到销毁的整个过程。Spring
容器负责管理Bean
的生命周期,通过依赖注入和面向切面的编程(AOP
)为开发者简化了许多繁琐的操作。Spring
框架提供了许多钩子方法,允许开发者在特定阶段执行自定义的逻辑。
Bean
的生命周期可以分为几个步骤
Bean
的定义阶段
Bean
元信息配置:定义Bean
的配置信息,包括类名、作用域、依赖等。Bean
元信息解析:将配置信息解析成Spring
内部的BeanDefinition
结构。Bean
注册:将BeanDefinition
注册到Spring
容器中。BeanDefinition
合并:类似于面向对象中的继承,一个BeanDefinition
可以继承另一个BeanDefinition
的属性。
加载BeanDefinition
中指定的类
在Spring
框架中,“加载类”通常指的是Spring
容器在创建Bean
之前,需要先通过类加载器将Bean
的类定义加载到JVM
中。这是Bean
生命周期的第一步,为后续的实例化、属性注入、初始化等步骤提供了基础.
实例化前(可选)
Spring
提供了扩展点,允许在Bean
实例化前执行一些逻辑。如果实现了InstantiationAwareBeanPostProcessor
接口的postProcessBeforeInstantiation
方法,并且返回了非null
值,则Spring
将不会进行默认的实例化,而是使用返回的对象进行后续操作。
实例化
通过反射机制创建Bean
实例。此时,Bean
对象被创建但还没有设置任何属性。(这里存在推断构造方法机制,在其他文章中会进行详解.)
属性注入
根据配置文件(如XML
或注解)中提供的定义,为Bean
注入属性.
Aware
接口回调
如果Bean
实现了Spring
提供的某些特殊接口(例如BeanNameAware
、BeanFactoryAware
、ApplicationContextAware
等),Spring
会在这个阶段回调这些接口方法,传递相应的上下文信息给Bean
BeanPostProcessor
前置处理
如果容器中有配置BeanPostProcessor
接口实现类,它会在Bean
初始化之前对Bean
进行一些处理(例如代理、修改Bean
的状态等)。这个阶段是在@PostConstruct
和InitializingBean
的afterPropertiesSet
方法之前.
初始化
初始化前(可选)
如果Bean
实现了InitializingBean
接口,或者通过配置指定了自定义的初始化方法(例如在XML
中定义init-method
,或通过注解@PostConstruct
),Spring
会在这一阶段调用这些方法。
初始化
执行初始化操作,如设置Bean
的状态、启动服务等。
初始化后(可选)
在初始化完成后,Spring
容器会再次调用BeanPostProcessor
的postProcessAfterInitialization
方法,对Bean
进行后续的处理操作,如代理增强等。这一步通常会用来做AOP
的相关操作。
Bean就绪使用
完成以上步骤后,Bean
进入就绪状态,可以被应用程序正常使用。
销毁前(可选)
当Spring
容器关闭时,如果Bean
实现了DisposableBean
接口,Spring
会调用其destroy
方法。或者,可以通过配置文件或注解(@PreDestroy
)来指定自定义的销毁方法。这一步主要用于释放资源、关闭连接等操作。
销毁
Bean
被销毁,生命周期结束。
总结
上述过程看起来非常的复杂,但是我们总结起来无非是几个大块:
- 注册
Bean
对象的信息,生成BeanDefinition
对象- 调用构造方法,实例化
Bean
对象- 属性注入(
@Autowird
,构造方法注入,setter
方法注入)- 调用
Aware
回调方法- 调用
@PostConstruct
注解或者实现的InitializingBean
接口方法- 初始化
- 调用
BeanPostProcessor
中的postmanProcessAfterInitialization
方法,实现AOP