
为了更直观地理解,我们可以将整个生命周期分为几个大的阶段,下图清晰地展示了这一过程:


@Component, @Service, @Autowired)或 Java 配置类(@Configuration, @Bean)来定义 Bean。
ApplicationContext)启动,加载并解析这些配置元数据,生成每个 Bean 的 BeanDefinition 对象,它包含了创建一个 Bean 所需的所有信息(如类名、作用域、是否懒加载等)。
1. 实例化(Instantiation)
2. 依赖注入(Populate Properties)
@Autowired, @Value)将所需的依赖注入到 Bean 的对应属性中。这一步填充了 Bean 的“血肉”。
3. Aware 接口回调(Aware Interface Injection)
Aware 接口,Spring 会在此阶段回调相应的方法,将一些容器相关的对象(如 BeanNameAware, BeanFactoryAware, ApplicationContextAware)注入到 Bean 中。
BeanNameAware:设置 Bean 的 ID/Name。
BeanFactoryAware:设置当前的 BeanFactory。
ApplicationContextAware:设置当前的 ApplicationContext(功能最全)。
EnvironmentAware:设置 Environment 对象(用于获取配置文件属性)等。
4. BeanPostProcessor 前置处理
BeanPostProcessor 接口的 Bean,它们的 postProcessBeforeInitialization 方法会在这个阶段被调用。它可以对 Bean 进行包装或增强,返回一个可能是代理对象的 Bean。
BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)
5. 初始化(Initialization)
InitializingBean 接口:如果 Bean 实现了 InitializingBean 接口,会调用其 afterPropertiesSet() 方法。
@Bean(initMethod = "...") 或 XML 中 init-method 属性指定的自定义初始化方法。
InitializingBean.afterPropertiesSet()
init-method
6. BeanPostProcessor 后置处理
BeanPostProcessor 的 postProcessAfterInitialization 方法会被调用。Spring AOP 就是基于此实现的。如果一个 Bean 需要被代理,通常在这里返回一个代理对象来包装目标 Bean。
BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)
7. Bean 就绪(Ready)
8. 使用期
9. 销毁(Destruction)
ApplicationContext)被关闭时,它会开始销毁容器中的所有单例 Bean。
DisposableBean 接口:如果 Bean 实现了 DisposableBean 接口,会调用其 destroy() 方法。
@Bean(destroyMethod = "...") 或 XML 中 destroy-method 属性指定的自定义销毁方法。常用于释放资源,如关闭数据库连接、文件句柄等。
DisposableBean.destroy()
destroy-method
@Lazy 的 Bean,只有在第一次被请求时才会触发上述初始化过程,而不是在容器启动时。
可以把这个过程想象成一个人的一生:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。