Spring——@Autowired和@Configuration注解区别

摘要

本文主要介绍了Spring框架中@Autowired和@Configuration注解的区别。@Autowired用于自动注入依赖,支持属性、构造器和方法注入。@Configuration则用于定义配置类,允许在类中使用@Bean注解声明Bean。文章详细解释了这两个注解的作用、使用场景和核心特性。

1. @Autowired注解

1.1.1. @Autowired作用

  • 自动注入依赖@Autowired 用于告诉 Spring 自动将某个对象注入到另一个对象的属性、构造器或方法中。
  • 它通过 类型匹配(by type)来寻找和注入 Spring 容器中的 Bean。

1.1.2. @Autowired使用场景

  1. 注入属性: 将 Spring 容器中的 Bean 自动注入到某个类的属性中。
@Component
public class ServiceA {
    @Autowired
    private ServiceB serviceB; // 自动注入 ServiceB 的实例
}
  1. 构造器注入(推荐): 注入依赖时,优先使用构造器注入,能够保证对象在创建时依赖完全初始化。
@Component
public class ServiceA {
    private final ServiceB serviceB;

    @Autowired
    public ServiceA(ServiceB serviceB) {
        this.serviceB = serviceB;
    }
}
  1. 方法注入: 使用 @Autowired 标注的方法,Spring 会自动调用,并将依赖注入为方法参数。
@Component
public class ServiceA {
    private ServiceB serviceB;

    @Autowired
    public void setServiceB(ServiceB serviceB) {
        this.serviceB = serviceB;
    }
}

1.1.3. @Autowired核心特性

  • 按类型注入:默认情况下,@Autowired 根据类型查找匹配的 Bean。
  • 可选性:可以通过 required = false 设置是否必须注入。
@Autowired(required = false)
private ServiceC serviceC; // 如果没有 ServiceC 的 Bean,Spring 不会抛出异常
  • 结合 @Qualifier:当存在多个类型匹配的 Bean 时,可通过 @Qualifier 指定具体的 Bean。
@Autowired
@Qualifier("serviceB1")
private ServiceB serviceB; // 注入名为 serviceB1 的 Bean

1.1.4. @Autowired总结

  • @Autowired 的职责是完成依赖注入。
  • 用于类内部注入其他 Bean。
  • 是 Spring IOC(控制反转)的核心机制。

2. @Configuration

2.1. @Configuration作用

  • 配置类注解@Configuration 用于标注一个类是 Spring 的 配置类,其主要职责是定义和管理 Bean。
  • 该类中定义的方法通常使用 @Bean 注解,Spring 会将这些方法的返回值注册为容器中的 Bean。

2.2. @Configuration使用场景

  1. 定义配置类: 创建一个配置类,用于集中管理 Bean 的创建。
@Configuration
public class AppConfig {
    @Bean
    public ServiceA serviceA() {
        return new ServiceA();
    }

    @Bean
    public ServiceB serviceB() {
        return new ServiceB();
    }
}
  1. 组合现有组件: 可以通过配置类来组合和定制第三方库或框架提供的组件。
@Configuration
public class CustomConfig {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  1. 条件化配置: 配置类可以与条件注解(如 @Conditional)配合,动态加载 Bean。
@Configuration
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
public class FeatureConfig {
    @Bean
    public FeatureService featureService() {
        return new FeatureService();
    }
}

2.3. 核心特性

  • 代替 XML 配置@Configuration 配置类是 Spring Java Config 的核心,代替了传统的 XML 文件。
  • 单例作用域@Configuration 配置类会对 @Bean 方法进行代理,确保返回的 Bean 始终是单例(即使手动调用该方法多次)。
  • 组合性:支持通过 @Import 导入其他配置类。
@Configuration
@Import(OtherConfig.class)
public class MainConfig {
}

2.4. 总结

  • @Configuration 的职责是定义配置类,生成和管理 Bean。
  • 用于将类本身注册到 Spring 容器中,并集中管理 Bean 的创建。
  • 是 Spring Java 配置的重要组成部分。

3. 结合使用的场景

通常 @Configuration@Autowired 会一起使用,比如:

  1. @Configuration 定义 Bean:
@Configuration
public class AppConfig {
    @Bean
    public ServiceA serviceA() {
        return new ServiceA(serviceB());
    }

    @Bean
    public ServiceB serviceB() {
        return new ServiceB();
    }
}
  1. 在其他类中用 @Autowired 注入:
@Component
public class Example {
    @Autowired
    private ServiceA serviceA; // 自动注入 serviceA Bean
}

通过 @Configuration 管理 Bean 的生成,配合 @Autowired 实现依赖注入,这样可以灵活解耦和集中管理代码逻辑。

4. @Autowired和@Configuration区别总结

特性

@Autowired

@Configuration

作用

用于 注入依赖,将 Bean 自动注入到类中

用于 定义配置类,集中管理 Bean 的创建与配置

使用范围

属性、构造器、方法

类级别

目的

自动装配 Spring 容器中的现有 Bean

定义和管理 Bean,生成新的 Bean

是否创建 Bean

不会创建新 Bean,只装配已有的 Bean

通过 @Bean

方法生成新的 Bean

常用场景

注入属性或方法依赖

替代 XML 配置类,集中管理应用配置

博文参考

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习--张量

机器学习–张量 机器学习的数据结构–张量 张量是机器学习程序中的数字容器,本质上就是各种不同维度的数组,如下图所示。 张量的维度称为轴(axis),轴的个数称为阶(rank) 标量–0D张量 impor…

标记数据集生成模型助力无数据情况下的大模型指令微调

在构建大模型应用时,通常有两种方式来改进效果,一种是构建外部知识库,利用RAG来完成。但RAG并不是万能的,对于特定领域的LLM应用,以及无需示例,就能完成特定任务等场合就需要进行微调。然而,微调…

nvm安装指定版本显示不存在及nvm ls-remote 列表只出现 iojs 而没有 node.js 解决办法

在使用 nvm install 18.20.3 安装 node 时会发现一直显示不存在此版本 Version 18.20.3 not found - try nvm ls-remote to browse available versions.使用 nvm ls-remote 查看可安装列表时发现,列表中只有 iojs 解决方法: 可以使用以下命令查看可安装…

5.ABAP结构体和内表

总学习目录请点击下面连接 SAP ABAP开发从0到入职,冷冬备战-CSDN博客 目录 5.1.结构化数据对象 定义 如何引用结构化的数据对象 拷贝 实战练习 创建 拷贝 调试代码 5.2.内表 行类型 键 表种类 存取类型 表类型 如何在本地定义表类型 内表三种可能的…

C#搭建WebApi服务

1,OWIN的介绍 OWIN 的全称是 “Open Web Interface for .NET”, OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一套标准的接口, 其目的是为了实现服务器与应用之间的解耦,使得便携式 .NET Web 应用以及跨平台的愿望成为现实…

unity 2D像素种田游戏学习记录(自用)

一、透明度排序轴 改变sprite的排序方式,默认按照z轴进行排序(离摄像机的远近)。可以将其改变成y轴的排序方式,这样可以使2D人物走在草丛的下方就不被遮挡,走在草丛上方就被遮挡,如下图。 在项目设置-图形…

K8S服务突然中断无法访问:报The node had condition: [DiskPressure]异常

一、背景 程序在运行过程中,突然无法访问,发现后台接口也无法访问;查看kuboard,发现报如下异常:The node had condition: [DiskPressure]. 继续查看磁盘使用率,发现系统盘使用率已经高达93%。问题前后呼应…

VLDB 2024 | 时空数据(Spatial-temporal)论文总结

VLDB 2024于2024年8月26号-8月30号在中国广州举行。 本文总结了VLDB 2024有关时空数据(time series data)的相关论文,主要包含如有疏漏,欢迎大家补充。 🌟【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘&#xf…

GTC2024 回顾 | 优阅达携手 HubSpot 亮相上海,赋能企业数字营销与全球业务增长

从初创企业入门到成长型企业拓展,再到 AI 驱动智能化运营,HubSpot 为企业的每步成长提供了全方位支持。 2024 年 11 月下旬,备受瞩目的 GTC2024 全球流量大会(上海)成功举办。本次大会汇聚了全国内多家跨境出海领域企业…

如何使用go语言的gin库来搭建一个属于自己的网页版GPT

我们将会使用go语言的gin库来搭建一个属于自己的网页版GPT 一、准备工作 我们需要使用到ollama,如何下载和使用[ollama](Ollama完整教程:本地LLM管理、WebUI对话、Python/Java客户端API应用 - 老牛啊 - 博客园)请看这个文档 有过gin环境的直接运行就可…

用户登录流程详解

目录 前言1. 登录请求的发起1.1 表单设计与数据收集1.2 请求发送与状态反馈 2. 验证码校验2.1 验证码的生成与展示2.2 验证码的校验机制 3. 登录前置校验3.1 检查账户状态3.2 登录频率限制 4. SS认证管理器的用户校验4.1 密码校验机制4.2 用户角色与权限检查 5. 登录成功后的处…

虚拟机与Xshell5和Xftp4连接与虚拟机克隆

虚拟机与Xshell5和Xftp4连接与虚拟机克隆 虚拟机与Xshell5和Xftp4连接 虚拟机与Xshell5连接 下载Xshell5后启动出现如下界面,点击新建 新建会话输入虚拟机命名,如master,主机输入虚拟机IP,xxx.xxx.xxx.xxx然后确认,…

【大模型系列篇】LLaMA-Factory大模型微调实践 - 从零开始

前一次我们使用了NVIDIA TensorRT-LLM 大模型推理框架对智谱chatglm3-6b模型格式进行了转换和量化压缩,并成功部署了推理服务,有兴趣的同学可以翻阅《NVIDIA TensorRT-LLM 大模型推理框架实践》,今天我们来实践如何通过LLaMA-Factory对大模型…

最大值和最小值的差

最大值和最小值的差 C语言代码C 语言代码Java语言代码Python语言代码 💐The Begin💐点点关注,收藏不迷路💐 输出一个整数序列中最大的数和最小的数的差。 输入 第一行为M,表示整数个数,整数个数不会大于1…

【SH】微信小程序调用EasyDL零门槛AI开发平台的图像分类研发笔记

文章目录 微信小程序字符串字符串模板字符串拼接 上传图片GET请求测试编写测试代码域名不合法问题 GET和POST请求测试 微信小程序字符串 字符串模板 这是ES6引入的特性,允许你通过反引号()创建模板字符串,并在其中嵌入变量或表达…

Certimate自动化SSL证书部署至IIS服务器

前言:笔者上一篇内容已经部署好了Certimate开源系统,于是开始搭建部署至Linux和Windows服务器,Linux服务器十分的顺利,申请证书-部署证书很快的完成了,但是部署至Windows Server的IIS服务时,遇到一些阻碍&a…

【C++算法】38.模拟_替换所有的问号

文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 1576. 替换所有的问号 题目描述: 解法 模拟算法就是依葫芦画瓢 特点是思路简单,主要考察代码能力 模拟算法流程(一定要在草稿纸上过一遍…

三菱FX3uPLC输入接线注意事项

FX3u微型控制器(DC输入型)的输入根据外部接线,漏型输入和源型输入都可使用。 但是,一定要连接S/S端子的接线。 详细事宜请参考“FX3U系列微型控制器硬件说明手册 AC电源型的输入接线事例(FX3U-囗MR/UA1除外) DC电源型的输入接线事例 *请不要与(0V)、(24V)端子接线…

Milvus向量数据库03-搜索理论

Milvus向量数据库03-搜索理论 1-ANN搜索 通过 k-最近邻(kNN)搜索可以找到一个查询向量的 k 个最近向量。kNN 算法将查询向量与向量空间中的每个向量进行比较,直到出现 k 个完全匹配的结果。尽管 kNN 搜索可以确保准确性,但十分耗…

链表刷题笔记(题解出自灵茶山)

反转链表 class Solution { public:ListNode* reverseList(ListNode* head){ListNode* cur head;ListNode* prv nullptr;while (cur){ ListNode* nxt cur->next; cur->next prv;prv cur;cur nxt; }return prv;} };反转倒数第n个链表 难点在于怎么找到要反转的头…