内容提要
Spring Bean 的生命周期包括实例化、属性填充、初始化和销毁四个主要步骤。实例化通过反射创建 Bean 实例,属性填充使用注解注入对象,初始化调用回调函数进行预处理,销毁则记录销毁方法以便释放资源。这些步骤的理解对面试和实际开发非常重要。
延伸解读
生命周期本质:doCreateBean 方法的执行逻辑
面试中常问的 Spring Bean 生命周期,实际上对应的是 AbstractAutowireCapableBeanFactory#doCreateBean 方法的执行逻辑。该方法主要完成四件事:实例化、属性填充、初始化和销毁方法注册。理解这一点,就能将零散的知识点串联起来,而不是死记硬背步骤。
实例化与初始化的区别
实例化是通过反射创建 Bean 实例的过程,而初始化是调用回调函数对 Bean 进行预处理。实例化发生在 createBeanInstance 方法中,初始化则发生在 initializeBean 方法中。明确区分这两个阶段,有助于理解 Spring 在 Bean 创建过程中的不同处理逻辑。
初始化阶段的扩展点与执行顺序
初始化阶段依次触发 Aware 接口方法、BeanPostProcessor 的前置处理、初始化方法(如 InitializingBean 的 afterPropertiesSet 或 XML 配置的 init-method)以及 BeanPostProcessor 的后置处理。需要注意的是,@PostConstruct 注解的方法是通过 BeanPostProcessor 处理的,与 XML 配置的 init-method 底层逻辑不同。
销毁方法的注册与资源释放
销毁阶段并非立即销毁 Bean,而是记录销毁方法,以便在容器关闭时调用以释放资源。可以通过 @PreDestroy 注解、XML 的 destroy-method 属性、实现 DisposableBean 接口或 AutoCloseable 接口来定义销毁逻辑。理解这一点有助于正确管理 Bean 的生命周期和资源清理。
Q&A
Spring Bean 的生命周期包括哪些主要步骤?
Spring Bean 的生命周期包括实例化、属性填充、初始化和销毁四个主要步骤。
Spring Bean 的实例化是如何实现的?
Spring Bean 的实例化是通过反射创建 Bean 实例的过程,具体在 createBean 方法中完成。
属性填充在 Spring Bean 生命周期中是如何进行的?
属性填充通过 populateBean 方法处理注入的对象和字符串,使用注解如 @Autowired 和 @Value。
Spring Bean 的初始化阶段包含哪些操作?
初始化阶段包括触发 Aware 接口方法、执行 BeanPostProcessor 的前后处理、调用初始化方法。
Spring Bean 的销毁方法是如何注册的?
销毁方法可以通过注解、XML 配置或实现 DisposableBean 接口来定义,销毁时会调用这些方法释放资源。
如何处理 Spring Bean 的循环依赖问题?
在实例化过程中,Spring 通过三级缓存来处理循环依赖,确保 Bean 的引用一致性。