(mic老师面试文档摘录)
普通人的回答:
Spring Bean 的生命周期,可以分为单例、多实例。呃... 不对,这个是 Spring Bean
的作用域。
生命周期,我想想....
我记得 Bean 的生命周期会有加载、实例化、销毁这些阶段,其他的记得不是很清晰。
再来看看高手的回答
高手的回答:
Spring 生命周期全过程大致分为五个阶段:
1.创建前准备阶段
2.创建实例阶段
3.依赖注入阶段
4.容器缓存阶段
5.销毁实例阶段
这张是 Spring Bean 生命周期完整流程图,其中对每个阶段的具体操作做了详细介绍:
(把这张图按照阶段截断,当我说第一个阶段时,就显示第一个阶段的图片,依次往后..)
1. 创建前准备阶段【干什么、作用】
这个阶段主要的作用是,Bean 在开始加载之前,需要从上下文和相关配置中解析并查
找 Bean 有关的扩展实现,
比如像`init-method`-容器在初始化 bean 时调用的方法、`destory-method`,容器在
销毁 bean 时调用的方法。
以及,BeanFactoryPostProcessor 这类的 bean 加载过程中的前置和后置处理。
这些类或者配置其实是 Spring 提供给开发者,用来实现 Bean 加载过程中的扩展机制,
在很多和 Spring 集成的中间件中比较常见,比如 Dubbo。
2. 创建实例阶段
这个阶段主要是通过反射来创建 Bean 的实例对象,并且扫描和解析 Bean 声明的一些
属性。
3. 依赖注入阶段
如果被实例化的 Bean 存在依赖其他 Bean 对象的情况,则需要对这些依赖 bean 进行
对象注入。比如常见的`@Autowired`、setter 注入等依赖注入的配置形式。
同时,在这个阶段会触发一些扩展的调用,比如常见的扩展类:BeanPostProcessors
(用来实现 bean 初始化前后的扩展回调)、
InitializingBean(这个类有一个 afterPropertiesSet(),这个在工作中也比较常见)、
BeanFactoryAware 等等。
4. 容器缓存阶段
容器缓存阶段主要是把 bean 保存到容器以及 Spring 的缓存中,到了这个阶段,Bean
就可以被开发者使用了。
这个阶段涉及到的操作,常见的有,`init-method`这个属性配置的方法, 会在这个阶
段调用。
以及像 BeanPostProcessors 方法中的后置处理器方法如:
postProcessAfterInitialization,也会在这个阶段触发。
5. 销毁实例阶段
当 Spring 应用上下文关闭时,该上下文中的所有 bean 都会被销毁。
如果存在 Bean 实现了 DisposableBean 接口,或者配置了`destory-method`属性,会
在这个阶段被调用。