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

Bean的生命周期 高频考点!

一、Bean生命周期的核心阶段

Spring Bean的生命周期指的是一个Bean在IoC容器中从创建到销毁的完整过程。这个过程可以分为以下几个关键阶段:

  1. 实例化​
    • 容器通过反射调用Bean的构造函数创建对象实例
    • 对应源码:AbstractAutowireCapableBeanFactory.createBeanInstance()
  2. 属性赋值​
    • 容器为Bean注入所需的依赖(通过setter方法、字段注入或构造函数注入)
    • 对应源码:AbstractAutowireCapableBeanFactory.populateBean()
  3. Aware接口回调
    • 如果Bean实现了各种Aware接口,容器会回调相应方法:
      • BeanNameAware.setBeanName():设置Bean的ID
      • BeanFactoryAware.setBeanFactory():设置BeanFactory引用
      • ApplicationContextAware.setApplicationContext():设置ApplicationContext引用
  4. BeanPostProcessor前置处理
    • 调用所有BeanPostProcessorpostProcessBeforeInitialization()方法
    • 这是对Bean进行增强的第一个扩展点
  5. 初始化方法执行(Initialization)​
    • 三种方式的初始化方法按顺序执行:
      • @PostConstruct注解标记的方法
      • InitializingBean.afterPropertiesSet()方法
      • XML或Java Config中自定义的init-method
  6. BeanPostProcessor后置处理
    • 调用所有BeanPostProcessorpostProcessAfterInitialization()方法
    • AOP代理正是在这个阶段通过AbstractAutoProxyCreator创建的
  7. Bean就绪
    • 此时Bean已经完全初始化,存在于应用上下文中,可以被其他对象使用
  8. 销毁​
    • 容器关闭时,执行销毁方法:
      • @PreDestroy注解标记的方法
      • DisposableBean.destroy()方法
      • XML或Java Config中自定义的destroy-method

二、常见面试问题深度剖析

1. Bean的实例化和初始化有什么区别?

这是考察对生命周期阶段划分的理解。实例化是指通过构造函数创建Bean对象的的过程,而初始化是指在对象创建完成后进行的属性注入和各种回调方法的执行。可以简单理解为:实例化是"出生",初始化是"成长"。

2. BeanPostProcessor和BeanFactoryPostProcessor有什么区别?

这个问题考察对Spring扩展机制的理解:

  • BeanFactoryPostProcessor:在Bean定义加载完成后、Bean实例化之前执行,用于修改Bean的配置元数据。它是容器级别的操作。
  • BeanPostProcessor:在Bean实例化完成后、初始化前后执行,用于修改或包装Bean实例本身。它是Bean级别的操作。
3. 如何解决循环依赖问题?

Spring通过三级缓存机制解决setter注入的循环依赖:

  • 一级缓存:存放完全初始化好的单例Bean
  • 二级缓存:存放早期暴露的半成品Bean(已实例化但未初始化)
  • 三级缓存:存放ObjectFactory,用于生成早期引用

当发生循环依赖时,Spring会在Bean实例化后提前将其ObjectFactory放入三级缓存,这样在注入依赖时可以通过ObjectFactory.getObject()获取到早期引用,从而打破循环。

4. @PostConstruct和init-method的执行顺序是什么?

根据Spring官方文档,初始化方法的执行顺序是:

  1. @PostConstruct注解标记的方法
  2. InitializingBean.afterPropertiesSet()方法
  3. 自定义的init-method

这种顺序设计确保了用户自定义的初始化方法具有最高的优先级。

5. Bean生命周期如何与AOP代理关联?

AOP代理的创建是在Bean生命周期的BeanPostProcessor后处理阶段完成的。具体来说,AbstractAutoProxyCreator会在其postProcessAfterInitialization()方法中检查当前Bean是否需要被代理,如果需要则创建代理对象并返回,替代原有的Bean实例。

三、实际开发中的应用场景

  1. 性能优化​:合理使用延迟初始化(@Lazy)避免应用启动时加载所有Bean
  2. 资源管理​:在初始化方法中打开资源,在销毁方法中释放资源,避免内存泄漏
  3. 扩展定制​:通过BeanPostProcessor实现自定义的逻辑增强,如日志记录、权限检查等
  4. 问题排查​:当出现依赖注入失败或初始化异常时,能快速定位问题阶段

文章转载自:

http://AWDREnCA.rpwht.cn
http://YmMhtA4l.rpwht.cn
http://zEIXPnPd.rpwht.cn
http://0NT1eUTh.rpwht.cn
http://jqLcjo9I.rpwht.cn
http://UXYCOxr1.rpwht.cn
http://f8Pl4FeM.rpwht.cn
http://Ru7Vv5lE.rpwht.cn
http://EH9cbmyT.rpwht.cn
http://dOItvhPO.rpwht.cn
http://1CLHEyHG.rpwht.cn
http://AspUBHck.rpwht.cn
http://Ss57Xo5K.rpwht.cn
http://nQbbEIbZ.rpwht.cn
http://xjrkKmiX.rpwht.cn
http://ZHqela2k.rpwht.cn
http://VFuVm093.rpwht.cn
http://5samjTsE.rpwht.cn
http://Y9LbPT33.rpwht.cn
http://6lQcsTrF.rpwht.cn
http://3Vy2kogs.rpwht.cn
http://FofSUbzt.rpwht.cn
http://nkqvhCV2.rpwht.cn
http://IFrArd7y.rpwht.cn
http://8ml3w3T5.rpwht.cn
http://fqNQcxOh.rpwht.cn
http://Q04ds0UV.rpwht.cn
http://SrOU94wu.rpwht.cn
http://xiU9gU10.rpwht.cn
http://NUkXu66Z.rpwht.cn
http://www.dtcms.com/a/376051.html

相关文章:

  • Redis 主从复制详解:原理、配置与主从切换实战
  • Java锁机制全解析:从AQS到CAS,深入理解synchronized与ReentrantLock
  • 基于SpringBoot的天气预报系统的设计与实现
  • Android 14 servicemanager的前世今生
  • TC_Motion多轴运动-电子齿轮
  • webrtc弱网-DelayBasedBwe 类源码分析与算法原理
  • 【Floor报错注入】
  • Docker生产部署
  • 小型语言模型:智能体AI的未来?
  • js垃圾回收机制
  • STM32开发(USART总线:UART总线)
  • Typescript - 通俗易懂的 interface 接口,创建接口 / 基础使用 / 可选属性 / 只读属性 / 任意属性(详细教程)
  • FastGPT源码解析 Agent 智能体应用创建流程和代码分析
  • [网络入侵AI检测] 模型性能评估与报告
  • chmod与chown命令的深度解析
  • 7层的API网关
  • 链表问题:LeetCode 两数相加 - 算法解析与详解
  • 类型别名(type)与接口(interface)的抉择
  • 4.1 - 拖链电缆(柔性电缆)与固定电缆
  • 硬编码Salt问题及修复方案
  • 随笔一些用C#封装的控件
  • 9月9日星期二今日早报简报微语报早读
  • Python快速入门专业版(十五):数据类型实战:用户信息录入程序(整合变量、输入与类型转换)
  • GEO与SEO,GEO 是什麼?SEO + AI = GEO 生成式搜尋引擎優化 全解析
  • Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL
  • 如果服务端有数据更新,浏览器缓存同时也没有过期,如何直接使用最新的数据
  • 使用java编写一个基础的彩票抽奖程序
  • 算法题 Day5---String类
  • 【靶场练习】--DVWA第二关Command Injection(命令执行)全难度分析
  • 什么是Adobe Analytics?数据驱动营销的关键工具​