当前位置: 首页 > news >正文

Bean 生命周期的关键阶段和详细流程

1. 实例化前(Bean 定义加载与解析)

BeanDefinition 扫描与注册:Spring Boot 启动时,通过 @ComponentScan 扫描指定包(默认是主类所在包及其子包)下的类(如 @Component、@Service、@Controller 等注解标记的类),将其解析为 BeanDefinition(Bean 的元数据,包含类名、作用域、依赖等信息),注册到 BeanDefinitionRegistry 中。此外,Spring Boot 的自动配置类(@Configuration + @Conditional 等)也会通过 @EnableAutoConfiguration 机制生成 BeanDefinition 并注册。

BeanFactory 准备:Spring 容器(如 ApplicationContext)内部通过 BeanFactory(默认 DefaultListableBeanFactory)管理 BeanDefinition,此时尚未创建实际的 Bean 实例。

2. 实例化(创建 Bean 对象)

通过构造器 / 工厂方法创建实例:

容器根据 BeanDefinition 信息,调用类的构造器(默认无参构造器,若有依赖则先解析构造器参数)或指定的工厂方法(如 @Bean 方法),创建 Bean 的原始实例(内存中分配对象,属性未初始化)。

若存在多个构造器,Spring 会根据参数匹配(如 @Autowired 标记的构造器)选择合适的构造器。

3. 属性注入(依赖注入,DI)

填充属性:

容器根据 BeanDefinition 中的依赖信息,将其他 Bean 或值(如 @Value 注入的配置)通过 setter 方法、字段注入(@Autowired 直接标记字段)或 构造器注入(已在实例化阶段完成)注入到当前 Bean 中。

依赖注入的核心是通过 BeanFactory 的 getBean() 方法获取依赖的 Bean,若依赖未创建则触发其生命周期(递归过程)。

4. 初始化前(Aware 接口回调)

感知容器信息:

若 Bean 实现了 Spring 的 Aware 系列接口,容器会在初始化前回调对应的方法,注入容器相关的资源:

  • BeanNameAware:注入当前 Bean 的名称(setBeanName(String name))。

  • BeanClassLoaderAware:注入类加载器(setBeanClassLoader(ClassLoader classLoader))。

  • BeanFactoryAware:注入 BeanFactory 实例(setBeanFactory(BeanFactory beanFactory))。

  • 若容器是 ApplicationContext,还会处理 ApplicationContextAware(注入上下文)、EnvironmentAware(注入环境配置)等。

5. 初始化前(BeanPostProcessor 前置处理)

执行 BeanPostProcessor.postProcessBeforeInitialization():

所有注册到容器的 BeanPostProcessor(Bean 后置处理器)会对当前 Bean 进行前置处理。

例如:

  • AutowiredAnnotationBeanPostProcessor:处理 @Autowired、@Value 注入(补充属性注入阶段的逻辑)。

  • CommonAnnotationBeanPostProcessor:处理 @Resource、@PostConstruct 等注解。

  • 自定义 BeanPostProcessor 可在此阶段修改 Bean 实例(如代理增强)。

6. 初始化(自定义初始化逻辑)

  • 执行 @PostConstruct 注解方法:若 Bean 的方法标注了 @PostConstruct(JSR-250 规范),容器会在此阶段调用该方法(由 CommonAnnotationBeanPostProcessor 触发),用于执行初始化逻辑(如资源加载)。

  • 执行 InitializingBean 接口方法:若 Bean 实现了 InitializingBean 接口,容器会调用其 afterPropertiesSet() 方法,在属性注入完成后执行初始化逻辑。

  • 执行自定义初始化方法:若在 @Bean(initMethod = "init") 或 XML 配置中指定了初始化方法(如 <bean init-method="init"/>),容器会调用该方法。

7. 初始化后(BeanPostProcessor 后置处理)

  • 执行 BeanPostProcessor.postProcessAfterInitialization():

  • 所有 BeanPostProcessor 对当前 Bean 进行后置处理,这是 Bean 初始化完成后的最后一步修改机会。典型应用:

  • AOP 代理生成:AnnotationAwareAspectJAutoProxyCreator 在此阶段为符合条件的 Bean 创建代理对象(如被 @Transactional、@Aspect 标记的类)。

  • 自定义增强:对 Bean 进行包装或功能扩展。

8. 就绪(Bean 可用)

经过上述阶段后,Bean 已完全初始化,被放入容器的缓存中(单例 Bean 存储在 singletonObjects 缓存),可被其他 Bean 引用或通过 ApplicationContext.getBean() 获取使用。

9. 销毁前(容器关闭阶段)

  • 执行 @PreDestroy 注解方法:若 Bean 的方法标注了 @PreDestroy(JSR-250 规范),容器关闭时会调用该方法(由 CommonAnnotationBeanPostProcessor 触发),用于释放资源(如关闭连接)。

  • 执行 DisposableBean 接口方法:若 Bean 实现了 DisposableBean 接口,容器会调用其 destroy() 方法,执行销毁逻辑。

  • 执行自定义销毁方法:若在 @Bean(destroyMethod = "destroy") 或 XML 配置中指定了销毁方法(如 <bean destroy-method="destroy"/>),容器会调用该方法。

10. 销毁(Bean 回收)

容器关闭后(如 Spring Boot 应用停止),Bean 被从容器中移除,内存由 JVM 垃圾回收机制回收。

 

总结:核心流程简化

 

BeanDefinition 注册 → 实例化 → 属性注入 → Aware 回调 → 初始化前(BeanPostProcessor) → 初始化(@PostConstruct → InitializingBean → 自定义方法) → 初始化后(BeanPostProcessor) → 就绪 → 销毁前(@PreDestroy → DisposableBean → 自定义方法) → 销毁

 

Spring Boot 对该流程的简化主要体现在自动配置(减少手动注册 BeanDefinition)和默认启用常用 BeanPostProcessor(如处理注解的处理器),但核心生命周期与 Spring 框架一致。

http://www.jsqmd.com/news/18244/

相关文章:

  • 数字媒体技术-培优讲练-知识点总结
  • Jmeter解决响应乱码的问题
  • https://juejin.cn/post/7529730683963588627
  • 实用指南:计算机毕业设计Python农作物产量预测分析 农作物爬虫 农产品可视化 农产品推荐系统 机器学习 深度学习 大数据毕业设计(源码+LW文档+PPT+详细讲解)
  • PCB布线一定不能走直角吗?一个或许有些离经叛道又颠覆常识的答案
  • 邮件大附件怎么发送的有效方案与技巧分享
  • 告别客服焦虑!用PandaWiki打造724小时AI在线客服
  • 替代ftp的文件传输协议:提升数据安全与传输效率的新选择
  • Jmeter解决临界部分控制器,锁限流的问题
  • Gitee DevOps:中国企业的研发效能加速器
  • 软件中版本号V1.0.0含义
  • LabVIEW继电保护检测 - 教程
  • 软件测试-缺陷管理篇
  • 数据安全交换系统介绍及其应用场景分析
  • vue项目引入iconfont(阿里巴巴矢量图标库)
  • DBeaver 设置语言为中文
  • 什么是文件摆渡系统?全面解析企业数据安全交换的核心工具
  • Gitee崛起:中国开发者生态的战略升级与未来布局
  • Docker Compose v2.35.1 更新!
  • 国内开发者如何选择最适合的代码管理工具?Gitee、GitHub、Bitbucket横向评测
  • 2025国产ITSM厂商选型指南:聚焦五大ITSM平台,赋能企业数字化运维
  • 【完整源码+数据集+部署教程】医疗设备显示器图像分割系统: yolov8-seg-C2f-SCConv - 详解
  • 基于STM32和MQ-5传感器实现天然气浓度检测并通过串口显示
  • 2025 年容器 / 结构 / 不锈钢 / 金属 / 过滤器铆焊厂家推荐北京大疆实业:精密制造与全链条服务的实践样本
  • 2025年10月销量第一证明机构推荐榜:尚普与华信人权威对比
  • 理解C++20的革命特性——协程支持1 - 实践
  • 国产代码托管平台Gitee的崛起:为何越来越多人选择它而非GitHub?
  • 飞驰云联亮相军工数字化转型发展峰会 共筑军工数字生态新范式
  • 2025年10月留香沐浴露对比榜:蓝蕨经典香型与四款热门香型横评
  • 2025 最新土工膜生产厂家推荐榜权威发布:聚焦 50 年寿命与 28MPa 强度,涵盖防渗 / HDPE / 复合等全品类标杆企业