Spring Ioc Bean 到底是什么

Bean 到底是什么?

简单来说,Spring Bean 就是一个由 Spring IoC 容器负责创建、管理和装配的 Java 对象。

它不是一种新的技术,它本质上还是一个普普通通的 Java 对象(POJO - Plain Old Java Object),但它的“户口”被注册到了 Spring 容器中,从此它就不再是一个“野生”的对象,而是一个受容器管理的“公民”。


最核心的区别:Bean vs. 普通的 Java 对象

为了彻底理解 Bean,我们把它和我们自己用 new 创建的普通对象做个对比。

特性普通 Java 对象 (自己 new 的)Spring Bean (容器管理的)
“生父”你(开发者)Spring IoC 容器
创建方式MyObject obj = new MyObject();通过配置(如 @Component 注解),由容器在后台自动创建。
生命周期由你控制。当没有引用指向它时,由 JVM 垃圾回收器回收。由容器全程管理:从创建 -> 依赖注入 -> 初始化 -> 使用 -> 销毁
依赖关系你必须手动创建并“塞给”它。new Service(new Repository());容器根据 @Autowired 等注解,自动找到并注入依赖。
“户口”野生对象,没户口,不受管理。在容器中有唯一标识(Bean ID),有“户口”,被严格管理。
“超能力”没有。它只是一个普通的对象。有! 容器可以赋予它 AOP 等“超能力”(如事务、日志、安全)。

我们用下面的比喻来详细描述:

  • 普通 Java 对象:就像一个生活在深山里的隐士。他自己盖房子(创建),自己找食物(处理依赖),自生自灭(生命周期),与世隔绝。
  • Spring Bean:就像一个生活在大城市里的注册公民
    • 政府(IoC 容器)会给他分配一个身份证号(Bean ID)。
    • 政府会帮他盖好房子,并把水电煤气都接好(创建并注入依赖)。
    • 他享受城市的公共服务,比如警察巡逻(AOP 安全切面)、银行服务(AOP 事务管理)。
    • 他需要遵守城市的规定,比如按时交税、参加社区活动(遵循容器的生命周期回调)。

为什么要用 Bean,而不是自己 new

因为把对象变成 Bean 交给容器管理,能带来巨大的好处,这些好处正是 IoC 要解决的问题:

  1. 解耦 (Decoupling)UserService 不需要知道它的 UserRepositoryMySqlUserRepository 还是 MongoUserRepository。它只需要声明“我需要一个 UserRepository”,容器会把配置好的那个给他。更换实现时,UserService 的代码完全不用动。

  2. 生命周期管理 (Lifecycle Management):你不需要关心一个复杂的对象(比如数据库连接池 DataSource)什么时候初始化、什么时候关闭。容器会帮你处理好这一切。你可以在 Bean 的特定生命阶段(如创建后、销毁前)执行自定义逻辑(使用 @PostConstruct, @PreDestroy)。

  3. 依赖注入 (Dependency Injection):自动解决对象之间的“你中有我,我中有你”的复杂关系。容器像一个聪明的装配工,自动把所有零件组装成一部可以工作的机器。

  4. 作用域控制 (Scope Management):容器可以精确控制 Bean 的实例数量。

    • Singleton (默认):整个应用中只有一个实例。这对于无状态的 Service 或 Repository 非常适合,节省了大量内存开销。
    • Prototype:每次请求时都创建一个新的实例。
    • Request/Session (Web环境):在一次 HTTP 请求或一个会话中共享同一个实例。
  5. AOP 的基础 (Foundation for AOP)这是最神奇的一点! 因为容器控制了 Bean 的创建过程,所以它有机会返回一个**代理对象(Proxy)**而不是原始对象。这个代理对象可以在你调用真实方法前后,悄悄地帮你做很多额外工作,比如:

    • 在你调用 @Transactional 标记的方法前,开启事务。
    • 在你调用方法后,提交或回滚事务。
    • 记录方法执行时间(日志切面)。
    • 进行权限检查(安全切面)。
      如果对象是你自己 new 的,Spring 就完全没有机会对它进行“增强”。

如何让一个对象成为 Bean?

在现代 Spring Boot 应用中,主要有两种方式:

  1. 使用构造型注解(Stereotype Annotations)

    • @Component:通用的组件注解。
    • @Service:用于业务逻辑层。
    • @Repository:用于数据访问层。
    • @Controller / @RestController:用于 Web 控制器层。
      只要在类上加上这些注解,Spring 的组件扫描(@ComponentScan)就会发现它,并将其注册为 Bean。
    @Service // 告诉Spring:请管理我,我是一个Bean!
    public class MyUserService {// ...
    }
    
  2. 使用 @Bean 注解
    在配置类(@Configuration)中,在一个方法上使用 @Bean 注解。这个方法的返回值就会被注册为一个 Bean。这种方式非常适合用来注册那些来自第三方库、我们无法直接修改源码的类。

    @Configuration
    public class AppConfig {@Bean // 告诉Spring:这个方法的返回值是一个Bean!public RestTemplate restTemplate() {// 这里可以进行复杂的初始化配置return new RestTemplate();}
    }
    

总结

Spring Bean 不是一个神秘的东西,它就是一个被 Spring IoC 容器接管了“生老病死”和“社会关系”的普通 Java 对象。 这种“接管”带来了巨大的架构优势,使得我们的代码更加灵活、可维护,并能轻松获得事务、安全等强大的企业级服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914591.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PCIe 总线及设备入门学习专栏 5.1.1 -- PCIe PERST# 信号的作用】

文章目录 PCIe PERSTN#PERST# 信号作用概述简要定义PERST# 的关键功能PERST# 的时序图示意Synopsys PCIe EP IP 中 PERST# 的作用关键信号接口典型复位流程示例代码(Verilog for Synopsys PCIe)PERST# 使用场景举例(Synopsys PCIe EP)1. 系统上电初始化2. 热复位特定设备3.…

使用python的pillow模块将图片转化为灰度图,获取值和修改值

使用python的pillow模块可以将图片转化为灰度图, 可以获取灰度图的特定点值,区域值, 修改值并保存到图片 图片转换为灰度图 from PIL import Image# 打开图片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

记忆力训练day41

通常是一个地点记2组词 数字和人体记忆宫殿更注重 即时性;地点记忆宫殿是长久性

自动微分模块

一.前言本章节我们是要学习梯队计算,⾃动微分(Autograd)模块对张量做了进⼀步的封装,具有⾃动求导功能。⾃动微分模块是构成神经⽹络 训练的必要模块,在神经⽹络的反向传播过程中,Autograd 模块基于正向计算…

深度学习·目标检测和语义分割基础

边缘框 不是标准的x,y坐标轴。边缘框三种表示:左上右下下坐标,左上坐标长宽,中心坐标长宽 COCO 目标检测数据集的格式:注意一个图片有多个物体,使用csv或者文件夹结构的格式不可取。 锚框算法 生成很多…

ffmpeg音视频处理大纲

FFmpeg 是一个功能强大的开源音视频处理工具集,其核心代码以 C 语言实现。下面从源码角度分析 FFmpeg 如何实现转码、压缩、提取、截取、拼接、合并和录屏等功能: 一、FFmpeg 核心架构与数据结构 FFmpeg 的源码结构围绕以下核心组件展开: lib…

网络安全小练习

一、docker搭建 1.安装 2.改变镜像源(推荐国内镜像源:阿里云镜像源) 登录阿里云容器镜像源服务( 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 ) 复制系统分配的专属地址 配置 sudo mkdir …

数据结构——顺序表的相关操作

一、顺序表基础认知​1.顺序表的定义与特点​顺序表是数据结构中一种线性存储结构,它将数据元素按照逻辑顺序依次存储在一片连续的物理内存空间中。简单来说,就是用一段地址连续的存储单元依次存放线性表的元素,且元素之间的逻辑关系通过物理…

2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?

在快节奏的 DevOps 时代,测试用例管理已不再是 QA 的独角戏,而是穿透需求—开发—测试—交付全流程的核心枢纽。想象一下,如果用例结构混乱,覆盖不全,甚至丢失版本变更历史,不仅协作乱,还影响交…

在线评测系统开发交流

https://space.bilibili.com/700332132?spm_id_from333.788.0.0 实验内容爬虫Web系统设计数据分析实验指导爬虫Web系统设计自然语言处理与信息检索数据可视化评分标准FAQ实验二:在线评测系统实验概述实验内容Step1:题目管理Step2:题目评测S…

Linux操作系统从入门到实战(十)Linux开发工具(下)make/Makefile的推导过程与扩展语法

Linux操作系统从入门到实战(十)Linux开发工具(下)make/Makefile的推导过程与扩展语法前言一、 make/Makefile的推导过程1. 先看一个完整的Makefile示例2. make的工作流程(1)寻找Makefile文件(2&…

NFS磁盘共享

步骤:注意事项‌:确保服务端防火墙关闭,或者允许2049端口通信,客户端需具备读写权限。服务器端安装NFS服务器:sudo apt-get install nfs-kernel-server # Debian/Ubuntu sudo yum install nfs-utils # Ce…

ORA-06413: 连接未打开

System.Data.OracleClient.OracleException:ORA-06413: 连接未打开 oracle 报错 ORA-06413: 连接未打开 db.Open();的报错链接未打开,System.Data.OracleClient.OracleException HResult0x80131938 MessageORA-06413: 连接未打开 关于ORA-06413错误(…

【PCIe 总线及设备入门学习专栏 5.1.2 -- PCIe EP core_rst_n 与 app_rst_n】

文章目录 app_rst_n 和 core_rst_n 的作用1. core_rst_n — PCIe 控制器内部逻辑复位作用控制方式2. app_rst_n — 应用层/用户逻辑复位作用特点两者关系图示:示例流程(Synopsys EP)rst_sync[3] 的作用详解(复位同步逻辑)为什么使用 rst_sync[3]?图示说明Synopsys 官方手…

Python初学者笔记第二十期 -- (文件IO)

第29节课 文件IO 在编程中,文件 I/O(输入/输出)允许程序与外部文件进行数据交互。Python 提供了丰富且易用的文件 I/O 操作方法,能让开发者轻松实现文件的读取、写入和修改等操作。 IO交互方向 从硬盘文件 -> 读取数据 -> 内…

Java JUC包概述

Java 的 java.util.concurrent(简称 JUC)包是 JDK 5 及以后引入的并发编程工具包,旨在解决传统线程模型(如 synchronized、wait/notify)的局限性,提供更灵活、高效、可扩展的并发编程组件。它极大简化了多线…

LeetCode--44.通配符匹配

前言:不知不觉又断更一天了,其实昨天就把这道题写得差不多了,只是刚好在力扣里面看见了一种新的解法,本来想写出来的,但是我把它推到今天了,因为太晚了,但是今天又睡懒觉了,所以我直…

WHAT - 依赖管理工具 CocoaPods

文章目录1. 什么是 CocoaPods?2. 如何安装 CocoaPods?(1) 确保已安装 Ruby(macOS 默认自带)(2) 安装 CocoaPods(3) 验证安装3. 在 React Native 项目中使用 CocoaPods(1) 进入 iOS 目录(2) 初始化 Podfile(如果不存在&…

C++ Boost Aiso TCP 网络聊天(服务端客户端一体化)

代码功能说明: 程序模式: 主动连接模式:当用户指定对端 IP 和端口时,尝试连接到对端被动监听模式:当用户未指定对端 IP 时,等待其他节点连接线程模型: 主线程:处理用户输入和消息发送接收线程:后台接收并显示对端消息关键组件: std::atomic<bool> connected:原…

WeakAuras 5.12.9 Ekkles lua

3.45猎人宝宝狼 技能恢复宏已知3.45BUG RL技能位会清空&#xff0c;小退大退 BB技能全部激活&#xff0c;修复以前可用宏一键恢复状态-------方法一&#xff1a;宏命令---------------------------------------------------------#showtooltip 狂怒之嚎 /petautocaston [btn:1]…