news 2026/8/30 4:37:39

spring-Bean

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
spring-Bean

Bean是什么?

Bean 就是 Spring IOC 容器管理的对象,交给 Spring 创建、装配、生命周期管理的 Java 对象就叫 Bean;自己new出来的对象不属于 Spring Bean。

如何定义 Bean?(三种配置方式)

Spring 提供三种方式来声明 Bean,现在企业开发中注解驱动是主流:

方式

适用场景

示例

XML 配置(老旧)

遗留系统维护,或需要引入第三方无法改源码的类

<bean id="userDao" class="com.dao.UserDao"/>

注解定义(最常用)

自己编写的类,直接在类上加注解

@Component、@Service、@Repository、@Controller

Java 配置类(推荐)

第三方类或需要复杂构造逻辑的 Bean

@Configuration + @Bean 写在方法上

@Component 和 @Bean 区别

  1. @Component:打在类上,适合自己写的业务类;由组件扫描自动发现。

  2. @Bean:打在配置类的方法上;适合第三方组件,类源码不能修改,无法加 @Component。

Bean 的作用域 scope

Spring 默认是 单例(Singleton)。

作用域

含义

适用场景

singleton(默认)

整个 IoC 容器中只有一个实例,所有地方共用。

无状态的 Service、Dao(绝大多数业务场景)。

prototype

每次从容器中 getBean() 或注入时,都新建一个实例。

有状态的对象(如每次请求参数不同的实体)。

request

仅对当前 HTTP 请求有效,每个请求新建一个。

Web 层,如当前登录用户信息对象。

session

仅对当前 HTTP Session 有效。

用户会话级别的购物车对象。

Bean 完整生命周期

  1. 解析配置:扫描类,生成 BeanDefinition

  2. 实例化:反射调用构造方法,new 出空对象(此时属性还没赋值)

  3. 依赖注入 DI:给属性赋值,装配 @Autowired 依赖

  4. Aware 接口回调:BeanNameAware、ApplicationContextAware,把容器 /beanName 注入给 bean

  5. 初始化阶段

  6. ① @PostConstruct 注解方法 ② InitializingBean#afterPropertiesSet() ③ @Bean(initMethod = "xxx") 指定初始化方法

  7. Bean 就绪,可以给业务使用

  8. 容器关闭销毁 ① @PreDestroy ② DisposableBean#destroy() ③ @Bean(destroyMethod="xxx")

BeanDefinition

实例化

属性注入

Aware 回调

BeanPostProcessor

初始化

BeanPostProcessor

Bean 可以使用

容器关闭

销毁

解决一个经典难题:循环依赖(三级缓存)

如果是单例 Bean,Spring 能解决 Setter 注入造成的循环依赖(如 A 依赖 B,B 依赖 A)。它利用的是三级缓存(singletonFactories),在对象实例化后、属性填充前,先把“半成品对象”提前曝光出来,从而打破闭环。

一级缓存 `singletonObjects`:完全初始化完毕的 Bean

二级缓存 `earlySingletonObjects`:实例化完成,但还没填充属性的对象,避免重复执行代理

三级缓存 `singletonFactories`:lambda 工厂,提前暴露对象引用,有可能生成代理对象

注意:构造器注入的循环依赖无法解决,Spring 会直接报错。因此,官方推荐使用 Setter 注入或字段注入来规避构造器循环依赖。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 4:34:07

产业互联网四流合一落地指南:统一主数据与事件驱动改造

做产业互联网平台的技术负责人&#xff0c;几乎都会遇到一个尴尬时刻&#xff1a;系统上线大半年&#xff0c;每个业务部门都在用&#xff0c;但一拉跨部门报表&#xff0c;订单数、发货数、到账数互相打架。更麻烦的是&#xff0c;这笔账很难靠加报表、加字段解决&#xff0c;…

作者头像 李华
网站建设 2026/8/30 4:31:20

告别Obsidian AI插件:用RAG与数据管道搭建个人知识库

打开 Obsidian&#xff0c;装上一堆 AI 插件&#xff0c;满心期待它变成一个“能自动思考的第二大脑”。结果呢&#xff1f;要么是插件和模型版本对不上&#xff0c;要么是问它“上周存的某篇笔记讲了什么”&#xff0c;它答非所问&#xff0c;要么是生成的摘要还不如你自己写。…

作者头像 李华
网站建设 2026/8/30 4:29:28

STM32H7双核调试实战:CubeIDE配置与踩坑指南

STM32H7的双核芯片做产品开发&#xff0c;最绕不开的一道坎就是双核调试。M7核跑主逻辑、M4核跑辅助任务&#xff0c;这种异构双核架构本身并不难理解&#xff0c;但等你想在STM32CubeIDE里同时控制两个核、分别查看寄存器、让两个核在需要的时刻同步停下来时&#xff0c;很多人…

作者头像 李华
网站建设 2026/8/30 4:28:47

7天高效攻克计算机基础八股文:高频考点与面试实战指南

“八股文”这个词&#xff0c;在计算机校招和社招圈子里&#xff0c;基本上是又爱又恨。爱的是它确实是很多大厂面试的敲门砖&#xff0c;恨的是背起来枯燥&#xff0c;而且网上资料鱼龙混杂&#xff0c;经常背着背着就怀疑人生。 我自己带过不少新人&#xff0c;也当过技术面…

作者头像 李华
网站建设 2026/8/30 4:28:29

从美团2016笔试题看研发工程师必备基础与系统设计

1. 一场老题重做&#xff1a;为什么2016年的笔试题到现在还有参考价值先说个比较有意思的现象。我最近帮团队做校招面试题库整理&#xff0c;翻到一套“美团2016研发工程师笔试题(三)”的老卷子&#xff0c;顺手把里面的题目过了一遍。说实话&#xff0c;刚拿到的时候我也觉得&…

作者头像 李华
网站建设 2026/8/30 4:27:31

AI不知道自己在做什么:大模型元认知缺失与Codex外部约束实践

最近 OpenAI 的开源动作很多&#xff0c;其中 Codex Harness 与 Codex CLI 的放出&#xff0c;被不少人解读成“OpenAI 全面拥抱开源生态”。但如果只看到“开源”这两个字&#xff0c;很容易忽略一个更基本的问题&#xff1a;Codex 这个项目本身&#xff0c;恰恰暴露了当前大模…

作者头像 李华