@Configuration 和 @Component 有什么区别?为什么有些配置类要用 @Configuration?

Spring注解配置:@Configuration 和 @Component 区别及原理详解 Indexed​/***/​复制代码@Component​​​复制代码从定义来看, @Configuration 注解本质上还是 @Component,因此 @ComponentScan 能扫描到@Configuration 注解的类。@Component在Spring中是代表LITE模式的配置注解,这种模式下的注解不会被Spring所代理,就是一个标准类,如果在这个类中有@Bean标注的方法,那么方法间的相互调用,其实就是普通Java类的方法的调用。 阅读详情

简单来说:

  • @Component 是一个通用的构造型注解,它告诉 Spring:“请把我这个类扫描成一个 Bean”。
  • @Configuration 是一个特殊的 @Component。它不仅能让类成为 Bean,还开启了一项“魔法”功能:确保 @Bean 方法返回的都是由容器管理的单例 Bean。

快速对比

特性@Component@Configuration
本质通用 Bean 标记特殊的 Bean 标记
继承关系无@Configuration 自身被 @Component 元注解标注
核心目的标记一个普通的业务组件(Service, Repository等)专门用于定义 Bean 的配置类
@Bean 方法行为Lite Mode(轻量模式)Full Mode(完整模式)
背后原理普通的 Bean通过 CGLIB 代理增强

关键区别:@Bean 方法的行为

这个区别是理解两者的关键。让我们通过一个例子来揭示这个“魔法”。

场景:我们有一个 Car Bean,它依赖于一个 Engine Bean。我们希望整个应用中只有一个 Engine 实例。

1. 使用 @Configuration(正确的方式)
@Configuration
public class AppConfig {

    @Bean
    public Engine engine() {
        System.out.println(">>> 创建 Engine Bean...");
        return new Engine();
    }

    @Bean
    public Car car() {
        System.out.println(">>> 创建 Car Bean...");
        // 这里直接调用了 engine() 方法
        Engine carEngine = this.engine(); 
        return new Car(carEngine);
    }
}

运行结果:

>>> 创建 Engine Bean...
>>> 创建 Car Bean...

分析:

  • engine() 方法只被调用了一次!
  • 当我们创建 car Bean 并调用 this.engine() 时,Spring 并没有真的去执行 engine() 方法体里的 new Engine()。
  • 为什么? 因为 AppConfig 类被 @Configuration 标记了,Spring 在启动时会为它创建一个 CGLIB 代理子类(比如 AppConfig$$EnhancerBySpringCGLIB$$...)。
  • 这个代理类重写了所有的 @Bean 方法。当你调用 this.engine() 时,代理会拦截这个调用,并检查 IoC 容器中是否已经存在一个名为 “engine” 的 Bean。如果存在,就直接返回容器中的那个单例实例;如果不存在,才执行原始方法体来创建它。
  • 结论:@Configuration 保证了无论你调用 @Bean 方法多少次,返回的都是同一个由容器管理的单例对象。

2. 使用 @Component(错误或危险的方式)

现在,我们把 @Configuration 换成 @Component,其他代码完全不变。

@Component // 这里换成了 @Component
public class AppConfigLite {

    @Bean
    public Engine engine() {
        System.out.println(">>> 创建 Engine Bean...");
        return new Engine();
    }

    @Bean
    public Car car() {
        System.out.println(">>> 创建 Car Bean...");
        // 这里直接调用了 engine() 方法
        Engine carEngine = this.engine(); 
        return new Car(carEngine);
    }
}

运行结果:

>>> 创建 Engine Bean...
>>> 创建 Car Bean...
>>> 创建 Engine Bean... 

分析:

  • engine() 方法被调用了两次!
  • 为什么? 因为 AppConfigLite 被 @Component 标记,Spring 只把它当作一个普通的 Bean。它不会为这个类创建 CGLIB 代理。
  • 因此,当 car() 方法内部调用 this.engine() 时,它就是一个普通的 Java 方法调用。它会完整地执行 engine() 方法体,即 new Engine(),从而创建了一个全新的、不受 Spring 容器管理的 Engine 实例。
  • 结论:在 @Component 类中调用 @Bean 方法,会绕过容器的管理,导致每次都创建新对象,破坏了单例作用域。

为什么有些配置类要用 @Configuration?

答案就是为了解决上面例子中的问题:确保 Bean 之间的依赖关系正确无误。

一个经典的真实场景是 DataSource 和 JdbcTemplate:

@Configuration
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        // 创建并返回一个 DataSource Bean
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl("...");
        ds.setUsername("...");
        ds.setPassword("...");
        return ds;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        // JdbcTemplate 依赖于 DataSource
        // 我们希望它使用的是上面由容器管理的那个单例 DataSource
        return new JdbcTemplate(this.dataSource()); 
    }
    
    @Bean

    public MyTransactionManager myTransactionManager() {
        // 另一个组件也依赖于同一个 DataSource
        return new MyTransactionManager(this.dataSource());
    }
}

在这个例子中,jdbcTemplate() 和 myTransactionManager() 都需要 DataSource。因为我们用了 @Configuration,所以两次 this.dataSource() 调用都会被 Spring 的代理拦截,并返回同一个由容器管理的 DataSource 实例。

如果这里错误地使用了 @Component,那么 JdbcTemplate 和 MyTransactionManager 将会各自持有一个全新的、独立的、不受容器管理的 DataSource 实例,这可能会导致连接池失效、事务管理混乱等一系列灾难性问题。

总结

@Configuration (Full Mode)@Component (Lite Mode)
用途首选,用于定义Bean的配置类,特别是当Bean之间有依赖关系时。用于普通的业务组件。不推荐在其中定义有相互依赖的 @Bean 方法。
行为通过CGLIB代理,保证 @Bean 方法调用返回容器中的单例Bean。普通Java方法调用,每次都创建新对象,绕过容器管理。
何时使用只要你的配置类里有 @Bean 方法,特别是它们之间有调用关系,就必须使用 @Configuration。当你的类只是一个简单的业务组件(如Service),或者你的配置类里的 @Bean 方法完全独立,没有相互调用时(但依然不推荐)。

所以,请记住这个黄金法则:任何用于定义 Bean(即包含 @Bean 方法)的类,都应该使用 @Configuration 注解,以确保其行为符合 Spring IoC 容器的预期。

三角洲行动交易行自动化脚本 DFMarketBot - 三角洲行动自动交易助手 DFMarketBot是一款专为三角洲行动游戏设计的交易行自动化工具,通过OCR识别和鼠标模拟实现自动补卡、补子弹功能。项目采用Python开发,支持Windows平台,主要功能包括: 自动检测并购买指定物品(房卡/子弹) 价格监控与智能购买(低于设定价格自动下单) 自定义购买数量与次数限制 支持窗口/无窗口两种游戏模式 使用前需安装Tesseract OCR引擎并配置游戏为1920*1080分辨率。通过JSON文件可灵活配置监控物品清单、理想价格和购买策 阅读详情

相关推荐

从 0 搭建一个智能问答工单系统:低代码 + 大模型的实战融合方案

企业智能问答工单系统解决方案:通过橙武低代码平台集成DeepSeek大模型,实现自动化工单处理与智能问答。系统能自动匹配知识库、分类工单,支持多渠道接入,显著提升响应效率(答复时间从12小时降至5分钟)。采用MySQL8表结构设计,结合向量数据库实现语义搜索,客服人力需求减少70%。系统支持知识库持续优化,AI答复满意度达88%,助力企业低成本构建智能客服中台。

欢迎来到我的优快云博客!我专注于技术创新和数字化转型,特别是在低代码平台、人工智能和大数据分析领域的探索与应用。通过深入分析各种行业案例,帮助企业加速数字化进程,提升运营效率与创新能力。在这里,您将找到关于低代码平台、AI技术、数据分析与 1549

深入@component注解与@Configuration

1、@Configuration 从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。 注意:@Configuration注解的配置类有如下要求: 1、@Configuration不可以是final类型;

weixin_41438466的博客 6871

共聚焦显微镜的光源、工作原理与选型

共聚焦显微镜作为科研与工业领域中重要的微观成像工具,凭借光源的精准适配性、光学切片技术的三维成像能力,以及对不同工业场景的定制化适配潜力,为半导体检测、工业部件分析、智能制造升级提供了关键技术支撑。深入理解其光源特性、工作原理与选型逻辑,能帮助工程师与技术人员精准匹配设备与生产需求,既保障微观检测的精度与效率,又为产业优化、技术创新筑牢微观观测的基础。

PhotonixBay的博客 1537

@Configuration和@Component

@Configuration注解能够使得加了它的对应的配置类在spring容器中是一个cglib代理bean,让配置类实例变成cglib代理实例的作用就是防止@Bean方法B又调用@Bean方法A的这种场景破坏了bean的单例性。解决这种场景的原理就是在spring实例化@Bean方法B对应的bean的时候,会通过反射调用配置类的@Bean方法B,在反射调用之前@Bean方法B放到currentlyInvokedFactoryMethod中,然后由于配置类已经是一个cglib代理对象了,

qq_40708942的博客 6143

最小可分辨对比度(MRC)

最小可分辨对比度的测试方法如下: 1)选择对比度测试靶板,一般有100%,50%,33.77%,15%,5%。 2)调整照度,确保能够清晰观测到图像中的靶标; 3)利用USAF1951分辨率靶观察找到能够分辨出的靶标。 1951 USAF分辨力测试图目前仍广泛地应用于测试光学成像系统(如显微镜和相机)的分辨能力。这种图案包括几组由三条短线构成组合,短线的尺寸从大到小。成像系统无法辩明的...

6272

【汽车ECU标定技术解析】DCM文件与A2L、HEX的协同工作机制

本文深入解析了汽车ECU标定中DCM、A2L与HEX三大核心文件的协同工作机制。A2L文件作为定义标定变量地址与规则的“图纸”,DCM文件承载工程师调试后的具体标定数据,最终通过A2L的地址映射,将DCM数据固化生成可刷入ECU的HEX文件,形成完整的标定数据流转闭环。

weixin_29214559的博客 436

Spring底层原理之bean的加载方式三 用注解声明配置类 以及@Configuration 和 @Component 的区别

@Configuration @Configuration是 Spring Framework 中的一个注解,它用于指示该类是一个配置类,它的作用类似于传统的 XML 配置文件。具体来说,它的主要功能有以下几点: 定义配置类:使用 @Configuration 注解的类可以提供 bean 的定义和其他 Spring 配置的定义。 声明 Bean:在配置类中,可以使用 @Bean 注解声明 bean。这些 bean 将由 Spring 容器管理,并可以在应用程序中通过依赖注入来使用。 替代 XML 配置

多多的博客 11万+

Kalibr 安装+制作采集的图片和IMU数据生成 .bag 文件 (坑最全,解决方法最简单,最详细哈哈)

方法一、Kalibr标定工具实现 开源代码连接:https://github.com/ethz-asl/kalibr 1.1 创建工作空间 ——下载程序——编译 mkdir -p ~/kalibr_workspace/src cd /kalibr_workspace/src git clone https://github.com/ethz-asl/Kalibr.git cd .. //返回上一级 catkin_make source devel/setup.bash ......

努力努力努力 6939

@Configuration与@Component作为配置类的区别

@Configuration注解的类: @Configuration public class MyBeanConfig { @Bean public Country country(){ return new Country(); } @Bean public UserInfo userInfo(){ return new UserInfo(country()...

weixin_44101221的博客 419

【C语言】初识C语言(上篇)

初识C语言第一部分

StackFrame 4009

1.2 机器人控制系统软硬件平台

工业机器人的软硬件平台架构是影响工业机器人性能和效率的重要因素。良好的软硬件平台架构可以帮助工业机器人更加稳定和高效地完成工作,提高生产效率。正确的软硬件配置还可以提高工业机器人的灵活性和可靠性,使其能够更好地适应不断变化的生产环境。 同时,工业机器人的软硬件平台架构还可以影响工业机器人的安全性和维护成本。如果软硬件平台架构不合适,工业机器人可能出现故障或安全隐患,需要大量的维护和维修费用。因此,选择适当的软硬件平台架构对于确保工业机器人的高效运行和长期使用是非常重要的。

Galaxy_Robot的博客 2万+

@Configuration与@Component作为配置类的区别详解

目录1.@Configuration注解的类:2.@Component注解的类:3.测试4.结果4.1 @Component的结果4.2 @Configuration的结果5.分析5.1 @Component的类没有动态代理,但可以用@Qualifier或者@Resource 前言:这篇文章主要介绍了@Configuration与@Component作为配置类的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.@Confi

qq_34246965的博客 981

SAP使用XCO框架创建RAP所有对象

通过XCO框架自动生成SAP ABAP开发对象。

DeveloperMrMeng的博客 548

Spring 中@Component和@Configuration作为配置类的区别

https://my.oschina.net/guangshan/blog/1807721

a15237851433的博客 647

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

@component注解与@Configuration的理解

@component注解与@Configuration的理解 首先来解释下@Configuration在来解释@component再来讲述两者的区别 @Configuration 从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationConte...

baidu_41634343的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

@Component和@Configuration配置类的区别

@Component和@Configuration区别是什么呢,哈,区别来了 后者功效大于前者 后者基于CGLIB代理,会直接从上下文调用并返回bean(单例),而不是再次执行方法(new对象) 后者在项目启动后,一切已初始化就绪,且只会初始化一次;前者在项目启动后,每次调用都会被初始化 后者处理逻辑较为复杂的业务场景,比如:注入bean(@bean);前者“简单粗暴”,类型与@Controll...

qq_36206259的博客 481

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring 核心机制:到底什么样的类才算配置类?@Configuration 与 @Component 的本质区别

本文系统梳理了Spring配置类的核心概念与实现形式。配置类(@Configuration)是Spring容器进行资源加载和Bean定义的核心入口,与普通组件类(@Component)存在本质区别。文章详细解析了配置类的定义标准、实现方式(标准注解式、简化注解式、非注解式、间接导入式)及其适用场景,深入探讨了@Bean和@Configuration注解的作用原理与使用规范。同时对比了不同配置形式(@Component+@Bean、XML配置等)的差异与优劣,强调@Configuration作为官方推荐方式在

l7_yuqi的博客 453

Spring @Configuration 和 @Component 区别

Spring @Configuration 和 @Component 区别 一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。 下面看看实现的细节。 @Configuration 注解: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Configuration {

qq_43842093的博客 511

@Component和@Configuration作为配置类的差别

随着spingboot的大火,注解式配置受到了大家的热烈欢迎,而@Component和@Configuration都可以作为配置类,之前一直都没觉得这两个用起来有什么差别,可能有时程序跑的和自己想的有所区别也没注意到。 直到看到这篇文章:https://my.oschina.net/guangshan/blog/1807721 。我意识到@Component和@Configuration是有区别...

一号搬砖手的博客 10万+

@Configuration 和 @Component 到底有啥区别?

Spring 注解中 @Configuration 和 @Conponent 区别总结为一句话就是: @Configuration 中所有带 @Bean 注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。而 @Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。

S mile0804的博客 2万+

@bean注解和@component注解的区别_Spring 中的一些注解

这也是很久之前写的,不出所料的话今天依旧是水文章的一天,就不该年初立flag。本文打算介绍几个不太容易说出其区别,或者用途的 Spring 注解,比如@Component与@Bean的比较,@ControllerAdvice是如何处理自定义异常的等等。Spring 中的一些注解1.@Component和@Bean的区别是什么?1.作用对象不同:@Component注解...

weixin_35544490的博客 2万+

@configuration和@component之间的区别是什么?

@configuration和@component之间的区别是什么?

weixin_44119329的博客 2万+

@Component与@Configuration区别联系

d

lzh的博客 631

@Component 和 @Bean 和 @configuration的区别

@Component 和 @Bean 和 @configuration的区别

beiback的博客 568
上一篇: @Component, @Service, @Repository, @Controller 有什么本质区别吗?为什么需要这么多不同的注解?
下一篇: @Primary 是做什么的?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值