java中Bean的生命周期

在 Spring 框架中,Bean 的生命周期是一个非常精细的过程,涉及多个阶段和扩展点。以下是详细的生命周期阶段划分,包含容器内部处理细节和扩展机制:

1. 容器启动阶段(准备工作)

在 Bean 实例化之前,Spring 容器会先完成自身的初始化:

  • 加载配置元数据(XML、注解、JavaConfig 等)
  • 解析配置,将 Bean 定义(BeanDefinition)注册到BeanDefinitionRegistry
  • 对 Bean 定义进行验证和合并(处理父子 Bean 定义继承关系)

2. 实例化前阶段(Before Instantiation)

  • BeanPostProcessor.postProcessBeforeInstantiation()
    容器在实例化 Bean 之前,会先调用所有BeanPostProcessor的此方法。
    ✅ 作用:可以返回一个代理对象替代原始 Bean,从而跳过后续的实例化步骤(AOP 动态代理常在此阶段介入)。

3. 实例化(Instantiation)

  • 容器根据BeanDefinition的信息,通过反射创建 Bean 的实例:
    • 若指定了构造函数参数,会选择匹配的构造函数(可能涉及ConstructorResolver解析构造函数依赖)
    • 实例化仅创建对象本身,属性尚未赋值,也未执行任何初始化逻辑
  • 此时的 Bean 是 "原始对象",仅完成了内存分配

4. 实例化后阶段(After Instantiation)

  • BeanPostProcessor.postProcessAfterInstantiation()
    实例化完成后立即调用,返回boolean值:
    • 返回false:跳过后续的属性赋值阶段
    • 返回true:继续执行属性注入

5. 属性赋值(Population / Dependency Injection)

  • 容器根据 Bean 定义中的依赖信息,为 Bean 的属性赋值:
    • 处理@Autowired@Resource等注解,或 XML 中的<property>配置
    • 通过setter方法注入,或直接字段注入(需开启field injection
    • 处理集合类型(ListMap等)、数组、嵌套 Bean 等复杂依赖
  • BeanPostProcessor.postProcessPropertyValues()
    在此阶段可以修改属性值,或对属性进行验证(如 JSR-303 数据校验)

6. Aware 接口回调(设置容器上下文信息)

若 Bean 实现了以下Aware接口,容器会依次调用其方法,注入容器相关信息:

  • BeanNameAware.setBeanName(String beanName):注入当前 Bean 在容器中的 ID / 名称
  • BeanClassLoaderAware.setBeanClassLoader(ClassLoader classLoader):注入类加载器
  • BeanFactoryAware.setBeanFactory(BeanFactory beanFactory):注入当前 BeanFactory
  • EnvironmentAware.setEnvironment(Environment environment):注入环境配置
  • EmbeddedValueResolverAware.setEmbeddedValueResolver(StringValueResolver resolver):注入字符串解析器(处理${}占位符)
  • ApplicationContextAware.setApplicationContext(ApplicationContext applicationContext):注入 ApplicationContext(仅在 Web 环境或 ApplicationContext 容器中生效)

7. 初始化前阶段(Before Initialization)

  • BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)
    所有Aware接口回调完成后,初始化方法执行前调用。
    ✅ 作用:对 Bean 进行预处理,如 AOP 的增强逻辑织入(生成代理对象)。
    典型应用:Spring 的AbstractAutoProxyCreator在此阶段创建代理。

8. 初始化阶段(Initialization)

执行自定义初始化逻辑,按以下优先级顺序执行:

  1. @PostConstruct注解方法
    JSR-250 规范注解,在依赖注入完成后自动调用(由CommonAnnotationBeanPostProcessor处理)。

  2. InitializingBean.afterPropertiesSet()
    实现 Spring 提供的接口,在属性赋值完成后执行。

  3. 自定义初始化方法

    • XML 配置:<bean init-method="init"/>
    • 注解:@Bean(initMethod = "init")
    • JavaConfig:@Bean(initMethod = "init")

✅ 初始化逻辑通常包括:资源加载(数据库连接、文件读取)、缓存初始化等。

9. 初始化后阶段(After Initialization)

  • BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)
    初始化完成后调用,可对 Bean 进行最终修饰。
    ✅ 作用:若此时返回代理对象,容器将使用代理对象替代原始 Bean(如事务管理的代理)。

10. 使用阶段(In Use)

  • Bean 已完全就绪,存入容器的缓存池(singletonObjects)中
  • 应用程序可通过getBean()获取 Bean 并使用
  • 对于单例 Bean,此阶段会持续到容器关闭;对于原型 Bean,使用后由 JVM 垃圾回收器管理

11. 销毁前阶段(Before Destruction)

当容器关闭时(如ApplicationContext.close()),单例 Bean 会触发销毁流程:

  • @PreDestroy注解方法
    JSR-250 规范注解,在 Bean 销毁前调用。

  • DisposableBean.destroy()
    实现 Spring 提供的接口,执行销毁逻辑。

  • 自定义销毁方法

    • XML 配置:<bean destroy-method="destroy"/>
    • 注解:@Bean(destroyMethod = "destroy")
    • JavaConfig:@Bean(destroyMethod = "destroy")

✅ 销毁逻辑通常包括:释放资源(关闭数据库连接、网络连接)、清理临时文件等。

12. 销毁后阶段(After Destruction)

  • Bean 从容器缓存中移除,彻底销毁
  • 若 Bean 实现了Phased接口,可指定销毁顺序(getPhase()返回值越大,销毁越晚)

特殊说明

  • 单例 Bean:全程由 Spring 容器管理,生命周期与容器一致
  • 原型 Bean:容器仅负责实例化、属性赋值和初始化,之后不再管理(销毁由 JVM 负责)
  • Web 环境:还会涉及ServletContextAware等 Web 相关Aware接口

通过上述生命周期,Spring 提供了强大的扩展能力,开发者可通过BeanPostProcessorAware接口、初始化 / 销毁方法等,在各个阶段插入自定义逻辑,实现对 Bean 的精细控制。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值