通俗易懂:@Configuration 和 @Component 注解的区别

文章目录

      • @Component:通用的组件注解
        • 什么情况下用 `@Component`?
        • 注意:
      • @Configuration:专门用来定义配置的类
        • 为什么使用 `@Configuration`?
      • @Configuration 和 @Component 的区别
        • 举个例子
      • 总结
      • 推荐阅读文章

在 Spring 中, @Configuration@Component 是两个常见的注解。它们都能让 Spring 把类变成一个 Bean,放入容器中,供应用其他部分使用,但它们的使用场景和目的有所不同。下面来看看这两者的区别和各自的用法。


@Component:通用的组件注解

@Component 是一个非常基础的注解,意思就是:“嘿,Spring,这个类我希望你管理一下,把它放到容器里当成 Bean 吧!”

什么情况下用 @Component

当你有一个类,想让 Spring 管理并可以随时注入它的实例时,就可以用 @Component。这个注解没有特别的用途限制,只要希望某个类变成 Spring 容器的一个 Bean,就可以用它,比如:

@Component
public class MyService {public void doSomething() {System.out.println("做一些事...");}
}

这样写完后,Spring 就会把 MyService 类加载到容器中,其他地方可以通过 @Autowired 注入它:

@Autowired
private MyService myService;
注意:
  • @Component 只是个通用的注解,不会做额外的配置。
  • 它适用于那些普通的服务类,比如你的业务逻辑类、帮助工具类等等。

@Configuration:专门用来定义配置的类

@Configuration 是一个更特殊的注解,专门用来定义配置类。什么是配置类呢?简单来说,就是把一系列 Bean 的定义写在一个类里,Spring 会去读取并加载这些 Bean。

为什么使用 @Configuration
  1. 集中管理配置:当你有很多需要配置的 Bean 时,可以把它们放在一个 @Configuration 类里集中管理。
  2. Bean 的创建方法:在 @Configuration 类里,你可以用 @Bean 注解在方法上,把方法的返回对象变成一个 Bean。

例如:

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}@Beanpublic AnotherService anotherService() {return new AnotherService();}
}

这样,AppConfig 类中的 myServiceanotherService 方法会被 Spring 容器调用,返回的对象会被自动放入容器中。这种方式也叫“Java 配置”,是 Spring 推荐的配置方式之一。

@Configuration 和 @Component 的区别

  1. 用途不同

    • @Component 用来标记普通的 Bean,让 Spring 自动扫描并管理。
    • @Configuration 是专门用于配置的类,可以定义多个 Bean,尤其适用于需要依赖管理的情况。
  2. 作用范围不同

    • @Component 可以用在任何类上,让它被 Spring 容器管理。
    • @Configuration 更倾向于定义配置类,内部可以用 @Bean 注解定义多个 Bean。
  3. 单例保证

    • 使用 @Configuration 时,Spring 会确保配置类中的 Bean 方法返回的 Bean 是单例的,即使方法被调用多次,也只会创建一个实例(即“代理”机制)。
    • @Component 没有这种机制,如果你用 @Component 配合 @Bean 方法,Spring 不会保证单例。
举个例子

假设你需要配置一个数据源(Database),还想管理一些普通的业务类:

// 普通组件类
@Component
public class MyService {// 一些业务逻辑
}// 配置类
@Configuration
public class DatabaseConfig {@Beanpublic DataSource dataSource() {// 配置数据源return new DataSource("url", "username", "password");}
}

在这个例子中,MyService 是一个业务类,用 @Component 就可以了。而 DatabaseConfig 作为一个配置类,用 @Configuration 更合适,可以集中管理数据源的配置。

总结

  • @Component:通用的组件注解,用来让 Spring 管理和自动扫描 Bean。适合普通业务类。
  • @Configuration:专门用于定义配置的类,可以集中管理多个 Bean 的创建。适合管理配置项和依赖关系。

当你只是想让 Spring 自动扫描和注入 Bean,用 @Component 就好;而如果你想定义配置和依赖,甚至创建多个 Bean,用 @Configuration 配合 @Bean 更合适。这就是 @Configuration@Component 的区别啦!希望这个解释对你有帮助!

推荐阅读文章

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 什么是 Cookie?简单介绍与使用方法

  • 什么是 Session?如何应用?

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • 如何理解应用 Java 多线程与并发编程?

  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 如何理解线程安全这个概念?

  • 理解 Java 桥接方法

  • Spring 整合嵌入式 Tomcat 容器

  • Tomcat 如何加载 SpringMVC 组件

  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”

  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”

  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”

  • Java 中消除 If-else 技巧总结

  • 线程池的核心参数配置(仅供参考)

  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)

  • Java 枚举的几个常用技巧,你可以试着用用

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • 探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)

  • 为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)

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

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

相关文章

Python爬虫项目 | 一、网易云音乐热歌榜歌曲

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 创建目录保存文件2.2.2 爬取网易云音乐热歌榜单歌曲 2.3 过程展示 3 总结 1.文章概要 学习Python爬虫知识,实现简单的一个小案例,网易云音乐热…

ffmpeg内存模型

文章目录 展示图拷贝packet 重要!!!avpacket.c相关函数av_packet_alloc 简单的赋值 里面的还有没有进行初始化的指针av_packet_ref 展示图 拷贝packet 拷贝packet有两种情况 1: 两个packet的buf引用的是同一个数据缓冲空间&#…

全域旅游平台(源码+文档+部署+讲解)

本文将深入解析“全域旅游平台”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 文旅-全域旅游平台-洛享游 包含景区、住宿、美食、演出、 路线、游记、购物、服务等模块 本项目名称为全域旅游服务管理平台,旨在为…

Unity内置渲染管线升级URP,使用ShaderGraph

问题描述 在内置渲染管线的工程中,导入之前通过ShaderGraph制作的Shader。 文件不可打开,我们需要升级成URP 过程记录 当前Unity版本 2022.3.49 安装Package 创建配置文件 Assets -> Rendering -> URP Asset 创建成功 修改配置 Edit->P…

【Flink】-- flink新版本发布:v2.0-preview1

目录 1、简介 2、非兼容变更 2.1、API 2.2、连接器适配计划 2.3、配置 2.4、其它 3、重要新特性 3.1、存算分离状态管理 3.2、物化表 3.3、批作业的自适应执行 3.4、流式湖仓 4、附加 4.1、非兼容性的 api 程序变更 4.1.2、Removed Classes # 4.1.3、Modified Cl…

flink sql同步mysql数据表到mysql

1. 关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalld2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署mysql yum -y install wget wget https://dev.mysql.com/get/Down…

Rust枚举之卧龙凤雏(Rust Option枚举、Rust Result枚举)(Rust Enum、Some(T)、Ok(T)、Err(E))链式操作

文章目录 Rust 枚举之卧龙凤雏枚举的基本概念枚举定义示例 Result 枚举:凤雏Result 枚举的定义Result 的使用场景示例 1:文件读取示例 2:链式操作与错误处理 Option 枚举:卧龙Option 枚举的定义Option 的使用场景示例 1&#xff1…

计算机网络-1.2分层结构

文章目录 三种分层结构OSI 七层模型(Open Systems Interconnection Model)TCP/IP 四层模型混合模型各层之间的关系PDU,SDU,PCIPDU(Protocol Data Unit)SDU(Service Data Unit)PCI(Protocol Cont…

C++玩转物联网-从零开始:树莓派Pico的“Hello World”项目入门指南

树莓派Pico是一款功能强大且价格实惠的微控制器,非常适合编程初学者和电子爱好者。本文将以“Hello World”项目为例,带您快速入门树莓派Pico的基本操作和配置,为日后探索更复杂的项目奠定基础。 1. 项目概述 “Hello World”项目是树莓派P…

启动本地开发环境(自带热启动)yarn serve

文章目录 1. 安装 Yarn使用 npm 安装 Yarn使用 Chocolatey 安装 Yarn(Windows 用户)使用 Homebrew 安装 Yarn(macOS 用户) 2. 安装项目依赖3. 启动项目开发模式启动生产模式启动 4. 构建项目开发模式构建生产模式构建 5. 其他常用…

nodejs 020: React语法规则 props和state

props和state 在 React 中,props 和 state 是管理数据流的两种核心机制。理解它们之间的区别和用途是构建 React 应用程序的基础。 一、props 和 state的区别 特性propsstate定义方式由父组件传递给子组件的数据组件内部管理的本地数据是否可修改不可变&#xff…

架构师备考-概念背诵(软件工程)

软件工程 软件开发生命周期: 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成概要设计、详细设计、编码、测试等。软件运行和维护:就是…

刷题强训(day06) -- 大数加法、链表相加、大数乘法

目录 1、大数加法 1.1 题目 1.2 思路 1.3 代码实现 2、链表相加(二) 2.1 题目 2.2 思路 2.3 代码实现 3、大数乘法 3.1 题目 3.2 思路 3.3 代码实现 1、大数加法 1.1 题目 1.2 思路 这道题可以模拟列竖式相加解答, 将每一位都转…

Java多线程编程(四)- 阻塞队列,生产者消费者模型,线程池

目录: 一.阻塞队列 二.线程池 一.阻塞队列 1.阻塞队列是⼀种特殊的队列. 也遵守 "先进先出" 的原则 阻塞队列能是⼀种线程安全的数据结构, 并且具有以下特性: 1.1.当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素 1.…

open3d

open3d open3d用于 3D 数据处理的现代库。 简介 Open3D 是一个开源库,支持快速开发处理 3D 数据的软件。Open3D 前端公开了一组精心挑选的 C 和 Python 数据结构和算法。后端经过高度优化,并设置为并行化。Open3D 是从零开始开发的,具有一更…

洞察鸿蒙生态,把握开发新机遇

随着科技的不断进步,鸿蒙系统以其独特的分布式架构和跨设备协同能力,逐渐在智能手机、智能穿戴、车载、家居等多个领域崭露头角,与安卓、iOS形成三足鼎立之势。作为一名开发者,我对鸿蒙生态的认知和了解如下: 一、鸿蒙…

adb 如何通过wifi连接手机

1. 电脑通过USB线连接手机 1.1手机开启开发者模式 以小米手机为例:连续点击OS版本系统(设置–>我的设备–>全部参数) 1.2在开发者模式下,启动允许USB安装与USB调试 操作步骤:设置>更多设置>开发者选项&g…

【webrtc】 RTP 中的 MID(Media Stream Identifier)

RTP 中的 MID(Media Stream Identifier) RID及其与MID的区别 cname与mid的对比【webrtc】CNAME 是rtprtcp中的Canonical Name(规范化名称) 同样都是RTP头部扩展: 基于mediasoup的最新的代码,学习,发现mid在创建RtpSendStream时是必须传递的参数: 例如 D:\XTRANS\soup\…

brother:什么是兄弟,你悟了吗?

brother(兄弟)这个单词好奇怪哦,它为什么就会是兄弟呢?为什么这样书写、这些字母组合在一起,就是兄弟呢?而且,西方人的兄弟brother一词和姐妹sister一词,并不是像中国人所称呼明确指…

如何在谷歌浏览器中优化内存使用

在日常使用电脑的过程中,我们经常会遇到系统资源被大量占用的情况,尤其是内存。谷歌浏览器作为一个广泛使用的网络浏览器,其内存占用问题也备受关注。本文将详细介绍如何在谷歌浏览器中优化内存使用,以提升浏览体验和系统性能。&a…