@component、@bean、@Configuration的区别

详细解析Spring框架中这三个最核心、也最容易混淆的注解:@Component@Bean@Configuration

为了快速理解,我们先看一个总结性的表格:

注解应用级别作用使用场景
@Component级别将类标识为Spring组件,让Spring自动扫描并创建实例(Bean)。标记我们自己编写的类,如Service、Repository、Controller等。
@Bean方法级别声明一个Bean。告诉Spring执行这个方法,并将返回的对象注册为Bean。注册第三方库的类或需要复杂初始化逻辑的类。
@Configuration级别声明一个配置类,作为@Bean方法定义的容器。专门用于组织和定义Bean的配置类。

下面我们用一个“自己动手组装电脑”的比喻来深入解释。

  • @Component标准化的流水线零件。比如CPU、内存条、显卡。这些零件都是按照标准生产的,工厂(Spring)的自动化扫描系统(@ComponentScan)只要看到图纸(类),就能自动生产并放到仓库(Spring容器)里备用。
  • @Bean定制化的组装说明书。比如,你想组装一个带RGB灯效的水冷散热系统。这需要多个步骤和零件,不能自动完成。你得写一份详细的说明书(方法),告诉工厂(Spring)如何一步步操作,最终组装出这个成品(Bean)。
  • @Configuration存放所有“定制说明书”的档案室。这个房间(类)本身也是工厂的一部分,专门用来存放各种@Bean说明书。工厂会优先查看这个档案室,按照里面的说明书来完成定制零件的组装。

1. @Component:类的“身份证”

@Component是最通用的一个注解,它的作用就是告诉Spring:“请注意,这个类是我的一个组件,请你扫描到它,并为我创建一个实例(Bean)放入容器中进行管理。

  • 如何工作:Spring通过**组件扫描(@ComponentScan)**机制,在启动时会自动查找所有被@Component及其衍生注解标记的类,并为它们创建对象。
  • 衍生注解:为了让组件的职责更清晰,Spring提供了三个@Component的“特化版”注解:
    • @Service:用在业务逻辑层(Service层)。
    • @Repository:用在数据访问层(DAO/Repository层),还能提供额外的异常转译功能。
    • @Controller / @RestController:用在Web控制层。
      在功能上,这四个注解几乎是等价的,但使用更具体的注解能让代码的意图更加明确。

使用场景用于标注你自己编写的类。当你希望Spring自动管理你写的Service、DAO等类时,就用它。

代码示例:

@Service // @Service本质上就是一个@Component
public class UserServiceImpl implements UserService {public void sayHello() {System.out.println("Hello from UserService!");}
}

你只需要在类上加一个注解,Spring就会自动帮你new UserServiceImpl()并管理起来。


2. @Bean:方法的“生产指令”

@Bean的作用是告诉Spring:“请执行这个方法,方法返回的那个对象,就是我想要你帮我管理的Bean。

  • 如何工作@Bean注解必须用在方法上,并且这个方法通常定义在一个被@Configuration标记的类中。Spring会调用这个方法,并将返回的对象注册到容器中。Bean的名称默认就是方法名。
  • 核心优势:它给了你完全的控制权来创建和配置Bean。

使用场景

  1. 注册第三方库的Bean:你想使用一个来自第三方库的类(比如RestTemplateDataSourceObjectMapper等),你无法修改它的源码去添加@Component注解。这时,你可以在你自己的配置类中写一个方法来创建它的实例,并用@Bean标记。
  2. 复杂的初始化逻辑:当一个对象的创建过程很复杂,需要在构造函数之外执行很多配置和初始化步骤时,可以把这些逻辑都封装在一个@Bean方法里。

代码示例:

@Configuration
public class AppConfig {// 我无法修改RestTemplate的源码,所以用@Bean来注册它@Beanpublic RestTemplate restTemplate() {// 在这里可以进行复杂的配置,比如设置超时时间、拦截器等return new RestTemplate();}
}

3. @Configuration:Bean定义的“大本营”

@Configuration的作用是告诉Spring:“这个类是一个配置中心,里面定义了很多Bean的创建信息(即包含了很多@Bean方法),请优先处理我。

  • 如何工作@Configuration本身也是一个@Component,所以它能被组件扫描发现。它的核心职责是作为@Bean方法的容器。
  • 一个关键的“黑魔法”@Configuration比普通的@Component多一个重要特性。被@Configuration注解的类会被Spring通过CGLIB动态代理来增强。这个增强的目的是为了解决Bean之间的依赖调用问题

@Configuration的“黑魔法”解释:

假设我们有两个Bean,beanB依赖beanA

@Configuration
public class MyConfig {@Beanpublic BeanA beanA() {return new BeanA();}@Beanpublic BeanB beanB() {// 在这里,我们调用了beanA()方法return new BeanB(beanA()); }
}
  • 如果用@Configuration:当调用beanB()方法时,其中的beanA()方法调用不会真的去执行new BeanA()。CGLIB代理会拦截这个调用,检查容器里是否已经存在名为beanA的Bean。如果存在,就直接返回容器里的那个单例实例;如果不存在,才执行方法体创建并注册,然后返回。这保证了无论beanA()被调用多少次,返回的都是同一个单例对象。

  • 如果用@Component替换@Configuration@Bean@Component类中也能工作(称为“Lite模式”),但此时没有CGLIB代理增强。当调用beanB()时,其中的beanA()就是一个普通的Java方法调用,它会每次都new BeanA(),从而破坏了Bean的单例性。

总结:何时用什么?

  • 规则1:用@Component来标注你自己的类。让Spring自动发现和管理它们,这是最常规、最推荐的做法。
  • 规则2:用@Bean@Configuration来处理“外部世界”。当你需要将第三方库的组件整合到Spring中,或者需要非常精细地控制Bean的创建过程时,就使用这种组合。

简单来说,@Component自动化配置的体现,而@Bean精细化、显式化配置的体现。两者相辅相成,共同构成了Spring强大的依赖注入能力。

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

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

相关文章

Android多媒体——音/视同步数据处理(二十)

在多媒体播放过程中,音频数据的处理不仅要保证其解码和输出的连续性,还需要与视频帧保持时间上的严格对齐,以实现良好的观看体验。Android 多媒体框架中的 NuPlayerRenderer 是负责最终渲染音视频数据的核心组件之一。 一、Audio数据处理 NuPlayerRenderer 是 Android 原生…

MYSQL 使用命令mysqldump备份数据库的时候需要用户具备什么权限

背景 之前都是使用数据库root用户备份数据库,没有权限问题,今天使用一个数据库基本用户备份数据库,提示一直没有权限,提示的很明显 mysqldump: Error: Access denied; you need (at least one of) the PROCESS privilege(s) for …

WebRTC源码线程-1

1、概述 本篇主要是简单介绍WebRTC中的线程,WebRTC源码对线程做了很多的封装。 1.1 WebRTC中线程的种类 1.1.1 信令线程 用于与应用层的交互,比如创建offer,answer,candidate等绝大多数的操作 1.1.2 工作线程 负责内部的处理逻辑&…

spring:使用标签xml静态工厂方法获取bean

在spring可以直接通过配置文件获取bean对象,如果获取的bean对象还有若干设置,需要自动完成,可以通过工厂方法获取bean对象。 静态工厂类,其中InterfaceUserDao和InterfaceUserService都是自定义的接口,可以自己替换。…

linux 用户态时间性能优化工具perf/strace/gdb/varlind/gprof

1. perf top -g或者top分析卡顿(cpu占用比较高的函数) gdb 是 GNU 调试器,可以用于分析程序的时间性能。虽然 info time 不是直接用于性能分析的命令,但 gdb 提供了与时间相关的功能,例如通过 timer 命令设置计时器或通过 info proc 查看进程的时间信息。 #include <…

客户端和服务器已成功建立 TCP 连接【输出解析】

文章目录 图片**1. 连接状态解析****第一条记录&#xff08;服务器监听&#xff09;****第二条记录&#xff08;客户端 → 服务器&#xff09;****第三条记录&#xff08;服务器 → 客户端&#xff09;** **2. 关键概念澄清****(1) 0.0.0.0 的含义****(2) 端口号的分配规则** *…

Win系统下的Linux系统——WSL 使用手册

我们在复现一些项目的时候&#xff0c;有些依赖包只能在 linux 环境下使用&#xff0c;还不打算使用远程服务器&#xff0c;那么此时我们可以使用 WSL 创建一个 ubutu 系统&#xff0c;在这个系统里创建虚拟环境、下载依赖包。然后&#xff0c;我们就可以在 windows 下的 vscod…

电脑同时连接内网和外网的方法,附外网连接局域网的操作设置

对于工作一般都设置在内网网段中&#xff0c;而同时由于需求需要连接外网&#xff0c;一般只能通过内网和外网的不断切换进行设置&#xff0c;如果可以同时连接内网和外网会更加便利&#xff0c;同时连接内网和外网方法具体如下。 一、电脑怎么弄可以同时连接内网和外网&#…

C++11:原子操作与内存顺序:从理论到实践的无锁并发实现

文章目录 0.简介1.并发编程需要保证的特性2.原子操作2.1 原子操作的特性 3.内存顺序3.1 顺序一致性3.2 释放-获取&#xff08;Release-Acquire)3.3 宽松顺序&#xff08;Relaxed)3.4 内存顺序 4.无锁并发5. 使用建议 0.简介 在并发编程中&#xff0c;原子性、可见性和有序性是…

oracle 归档日志与RECOVERY_FILE_DEST 视图

1. RECOVERY_FILE_DEST 视图的作用 RECOVERY_FILE_DEST 是 Oracle 数据库用于 管理快速恢复区&#xff08;Fast Recovery Area, FRA&#xff09; 的一个视图。FRA 是 Oracle 提供的一种集中存储恢复相关文件&#xff08;如归档日志、备份文件、闪回日志等&#xff09;的区域。…

零基础玩转物联网-串口转以太网模块如何快速实现与MQTT服务器通信

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 驱动检查 3 MQTT服务器通信配置与交互 3.1 硬件连接 3.2 开启MQTT服务器 3.3 打开配置工具读取基本信息 3.4 填写连接参数进行连接 3.5 通信测试 4 总结 1 前言 MQTT&#xff1a;全称为消息队列遥测传输协议&#xff08;…

六、Sqoop 导出

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月7日 专栏&#xff1a;Sqoop教程 Apache Sqoop 不仅擅长从关系型数据库 (RDBMS) 向 Hadoop (HDFS, Hive, HBase) 导入数据&#xff0c;同样也强大地支持反向操作——将存储在 Hadoop 中的数据导出 (Export) 回关系型数据库。…

数据结构-如果将堆结构应用到TOP-K问题上会怎样?

数据结构的应用-如何用堆解决TOP-K问题 前言一、TOP-K问题是什么&#xff1f;二、如何用堆解决TOP-K问题1.怎么建堆&#xff0c;建大堆还是小堆&#xff1f;2.代码实现 总结 前言 本篇文章进行如何用堆结构解决TOP-K问题的讲解 一、TOP-K问题是什么&#xff1f; TOP-k问题&am…

Elasticsearch的索引

正向索引和倒排索引 什么是正向索引&#xff1f; 传统的数据库采用正向索引&#xff0c;如MySQL将表中的id创建索引&#xff0c;正向索引在进行不是id为索引进行搜索的时候&#xff0c;会逐条进行查询&#xff0c;比方说 上图的表格&#xff0c;数据库进行逐条查询&#xff0c;…

分散电站,集中掌控,安科瑞光伏云平台助力企业绿色转型

本项目位于香港全境共计52个分布式光伏站&#xff0c;总装机容量8.6MW。发电模式自发自用&#xff0c;余电上网&#xff0c;逆变器采用阳光电源SG100CX、SG20RT等12种型号共计103台&#xff0c;其余型号共计15台。每个站点均配置气象站。 项目采用AcrelCloud-1200分布式光伏运…

开发记录:修复一些Bug,并实现两个功能

开发记录&#xff1a; &#x1f4cb; 工作概述 到今天主要完成了AI阅读助手的两大核心功能&#xff1a;前情提要和名词解释&#xff0c;并对相关交互体验进行了优化。通过流式SSE技术实现了实时AI内容生成&#xff0c;大幅提升了用户体验。 &#x1f3af; 主要完成功能 1…

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…

【HarmonyOS 5.0】开发实战:从UI到Native全解析

一、环境搭建与项目创建 ​​跨平台安装​​ DevEco Studio支持Windows/macOS系统&#xff0c;安装包集成HarmonyOS SDK、Node.js和OHPM工具链。 Windows&#xff1a;双击.exe选择非中文路径macOS&#xff1a;拖拽.app至Applications目录验证&#xff1a;通过Help > Diagnos…

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…

华为OD最新机试真题-食堂供餐-OD统一考试(B卷)

题目描述 某公司员工食堂以盒饭方式供餐。 为将员工取餐排队时间降低为0,食堂的供餐速度必须要足够快,现在需要根据以往员工取餐的统计信息,计算出一个刚好能达成排队时间为0的最低供餐速度。即,食堂在每个单位时间内必须至少做出 多少价盒饭才能满足要求。 输入描述 第1行…