【Java 开发日记】我们来说一下 bean 的生命周期

【Java 开发日记】我们来说一下 bean 的生命周期

目录

Bean 生命周期的详细步骤

第一阶段:Bean 的元数据配置与容器启动

第二阶段:Bean 的实例化与初始化(核心生命周期)

第三阶段:Bean 的使用与销毁

特殊情况的处理

总结与记忆技巧


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

Bean 生命周期的详细步骤

第一阶段:Bean 的元数据配置与容器启动
  1. 配置元数据:首先,你需要通过 XML、Java 注解(如 @Component@Service@Autowired)或 Java 配置类(@Configuration@Bean)来定义 Bean。
  2. 容器启动:Spring 容器(如 ApplicationContext)启动,加载并解析这些配置元数据,生成每个 Bean 的 BeanDefinition 对象,它包含了创建一个 Bean 所需的所有信息(如类名、作用域、是否懒加载等)。
第二阶段:Bean 的实例化与初始化(核心生命周期)

1. 实例化(Instantiation)

  • 描述:容器首先会调用 Bean 的构造函数(或工厂方法)来创建一个新的实例。此时只是一个简单的 Java 对象,还没有进行依赖注入,我们可以把它比作“新生儿”。
  • 扩展点:无直接扩展点。

2. 依赖注入(Populate Properties)

  • 描述:Spring 根据配置(如 @Autowired@Value)将所需的依赖注入到 Bean 的对应属性中。这一步填充了 Bean 的“血肉”。
  • 扩展点:无直接扩展点。

3. Aware 接口回调(Aware Interface Injection)

  • 描述:如果 Bean 实现了各种 Aware 接口,Spring 会在此阶段回调相应的方法,将一些容器相关的对象(如 BeanNameAwareBeanFactoryAwareApplicationContextAware)注入到 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)

  • 描述:Bean 的“成人礼”。在这个阶段,Bean 的初始化逻辑会被执行。
    • a. InitializingBean 接口:如果 Bean 实现了 InitializingBean 接口,会调用其 afterPropertiesSet() 方法。
    • b. 自定义初始化方法:调用通过 @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)

  • 描述:经过以上所有步骤,Bean 已经完全创建、初始化并可能被代理。它被存放在 Spring 容器(单例池)中,可以被应用程序正常获取和使用了。
第三阶段:Bean 的使用与销毁

8. 使用期

  • 描述:在应用程序运行期间,Bean 被其他组件依赖和调用,执行业务逻辑。

9. 销毁(Destruction)

  • 描述:当 Spring 容器(通常是 ApplicationContext)被关闭时,它会开始销毁容器中的所有单例 Bean。
    • a. DisposableBean 接口:如果 Bean 实现了 DisposableBean 接口,会调用其 destroy() 方法。
    • b. 自定义销毁方法:调用通过 @Bean(destroyMethod = "...") 或 XML 中 destroy-method 属性指定的自定义销毁方法。常用于释放资源,如关闭数据库连接、文件句柄等。
  • 扩展点
    • DisposableBean.destroy()
    • 自定义 destroy-method

特殊情况的处理

  • 作用域(Scope):上述生命周期主要针对单例(Singleton) Bean。对于原型(Prototype) 作用域的 Bean,Spring 容器只负责到第 6 步(初始化完成),之后就将 Bean 交给客户端,不再管理其生命周期,因此不会调用销毁方法。
  • 延迟初始化(Lazy):标记为 @Lazy 的 Bean,只有在第一次被请求时才会触发上述初始化过程,而不是在容器启动时。

总结与记忆技巧

可以把这个过程想象成一个人的一生:

  • 实例化:出生
  • 依赖注入:接受教育,获取生存技能(依赖)
  • Aware 接口:获得身份ID、认识家庭和社会(容器环境)
  • BeanPostProcessor(前):步入社会前的指导
  • 初始化:举行成人礼,开始独立承担责任
  • BeanPostProcessor(后):步入社会后的包装/历练(可能被“代理”)
  • 就绪:成为社会栋梁,贡献力量
  • 销毁:退休,安享晚年,处理身后事

如果小假的内容对你有帮助,请点赞评论收藏。创作不易,大家的支持就是我坚持下去的动力!

Read more

优选算法——滑动窗口

优选算法——滑动窗口

优选算法——滑动窗口 1.长度最小的子数组 解题原理 📋 解题步骤 第一步:理解题意 * 找一个连续子数组,使其和 ≥ target,且长度最小 * 数组元素都是正整数(关键性质) * 无解返回 0 第二步:分析暴力解法 * 枚举所有子数组:O(n²) 或 O(n³) * 对于 n = 10⁵ 会超时 第三步:寻找优化点 * 正整数 → 窗口扩展时和单调递增 * 可以用滑动窗口优化 第四步:设计滑动窗口 遍历右指针: 扩展窗口 从右边进窗口 判断: 如果 sum >= target: 更新最小长度 收缩窗口 从左边出窗口 第五步:手动模拟 步骤leftright窗口sumresult403[2,

By Ne0inhk
C++:探索哈希表秘密之哈希桶实现哈希

C++:探索哈希表秘密之哈希桶实现哈希

文章目录 * 前言 * 一、链地址法概念 * 二、哈希表扩容 * 三、哈希桶插入逻辑 * 四、析构函数 * 五、删除逻辑 * 六、查找 * 七、链地址法代码实现总结 前言 前面我们用开放定址法代码实现了哈希表: C++:揭秘哈希:提升查找效率的终极技巧_1 对于开放定址法来说,包含以下两种探测插入节点位置方法: 1. 线性探测 2. 二次探测 但是开放定址法的缺点也很明显,开放定址法容易很多数据堆积在一起,大大减少了效率。 为了解决上述问题,引入了第二种方法实现哈希表 ——链地址法(哈希桶法) 一、链地址法概念 开放定址法中,所有的元素都放到哈希表里。 链地址法中,所有的数据不再直接存储在哈希表中。哈希表中存储一个指针,没有数据映射到这个位置时,这个指针为空;有多个数据映射到这个位置时,我们把这些冲突的数据链接成一个链表,挂在哈希表这个位置下面。链地址法也叫做拉链法或者哈希桶。 下⾯演⽰

By Ne0inhk
【数据结构】彻底搞懂二叉树:四种遍历逻辑、经典OJ题与递归性能全解析

【数据结构】彻底搞懂二叉树:四种遍历逻辑、经典OJ题与递归性能全解析

🏠 个人主页:EXtreme35 📚 个人专栏: 专栏名称专栏主题简述《C语言》C语言基础、语法解析与实战应用《数据结构》线性表、树、图等核心数据结构详解《题解思维》算法思路、解题技巧与高效编程实践 目录 * 二叉树全栈进阶指南:从内存布局到递归本质的深度复盘 * 一、二叉树的底层逻辑与核心概念 * 1.1 核心定义与特点 * 1.2 二叉树的五种基本形态 * 1.3 特殊二叉树 * 1.4 二叉树的五条性质 * 1.5 存储结构 * 二、遍历的递归之美 * 2.1 前序遍历 * 2.2 中序遍历 (In-order Traversal) * 2.3 后序遍历 (Post-order Traversal) * 2.

By Ne0inhk
Flutter 组件 easter 适配鸿蒙 HarmonyOS 实战:天文学节气算法,构建全球化复活节周期与民俗历法治理架构

Flutter 组件 easter 适配鸿蒙 HarmonyOS 实战:天文学节气算法,构建全球化复活节周期与民俗历法治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 easter 适配鸿蒙 HarmonyOS 实战:天文学节气算法,构建全球化复活节周期与民俗历法治理架构 前言 在鸿蒙(OpenHarmony)生态迈向全球化部署、涉及跨区域文化适配(I18n)及复杂变动日期计算的背景下,如何精确推演具备“阴阳历混合特性”的全球性节日(如复活节),已成为决定跨国类应用“运营确定性”的核心技术难点。在鸿蒙设备这类强调 AOT 极致性能与低功耗常驻服务(AOD)的环境下,如果应用依然依赖手动配置的“节日死表”,由于由于复活节日期在全球范围内的复杂游移性,极易由于由于配置滞后导致海外营销活动的时序错乱。 我们需要一种能够实现高精度天文学推演、支持百年尺度计算且具备纯 Dart 离线运作能力的历法预判方案。 easter 为 Flutter 开发者引入了基于高斯算法(Gauss's algorithm)或曼氏算法(Meeus&

By Ne0inhk