当前位置: 首页 > news >正文

【Spring】19 @Autowired注解使用详解

文章目录

      • 构造函数注入
      • Setter方法注入
      • 字段注入
      • 数组和集合注入
      • 特殊情况处理
      • 特殊接口类型的注入
      • 异常处理
      • 结语

Spring 框架的 @Autowired 注解是实现依赖注入的一种强大而灵活的方式。在本文中,我们将介绍 @Autowired 注解的多种用法,包括构造函数、setter方法、字段、集合和特殊情况的处理。

构造函数注入

@Autowired 注解可以用于构造函数,例如:

public class MovieRecommender {private final CustomerPreferenceDao customerPreferenceDao;@Autowiredpublic MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {this.customerPreferenceDao = customerPreferenceDao;}// ...
}

从 Spring Framework 4.3 版本开始,如果目标 bean 的构造函数只有一个,就不再需要在该构造函数上添加@Autowired 注解。但如果存在多个构造函数,且没有主/默认构造函数,则至少要在其中一个构造函数上添加@Autowired 注解。

Setter方法注入

@Autowired 注解同样可以用于传统的 setter 方法:

public class SimpleMovieLister {private MovieFinder movieFinder;@Autowiredpublic void setMovieFinder(MovieFinder movieFinder) {this.movieFinder = movieFinder;}// ...
}

此外,注解还可以用于具有任意名称和多个参数的方法:

public class MovieRecommender {private MovieCatalog movieCatalog;private CustomerPreferenceDao customerPreferenceDao;@Autowiredpublic void prepare(MovieCatalog movieCatalog, CustomerPreferenceDao customerPreferenceDao) {this.movieCatalog = movieCatalog;this.customerPreferenceDao = customerPreferenceDao;}// ...
}

字段注入

@Autowired 注解还可以用于字段,并且可以与构造函数混用:

public class MovieRecommender {private final CustomerPreferenceDao customerPreferenceDao;@Autowiredprivate MovieCatalog movieCatalog;@Autowiredpublic MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {this.customerPreferenceDao = customerPreferenceDao;}// ...
}

需要确保目标组件的声明类型与 @Autowired 注解的注入点类型一致,以避免在运行时出现 “no type match found” 错误。

数组和集合注入

通过 @Autowired 注解,你可以将容器中所有特定类型的 bean 注入到数组或集合中:

public class MovieRecommender {@Autowiredprivate MovieCatalog[] movieCatalogs;// 或者private Set<MovieCatalog> movieCatalogs;@Autowiredpublic void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {this.movieCatalogs = movieCatalogs;}// ...
}

如果希望数组或集合中的元素按照特定顺序排序,可以使用 @Order 注解或 Java 8 的 Optional、@Nullable 注解。

特殊情况处理

当没有匹配的候选 bean 可用于给定的注入点时,默认情况下,@Autowired 注解会导致注入失败。你可以通过将@Autowired 的 required 属性设置为 false 来更改此行为,使其变为非必需的:

public class SimpleMovieLister {private MovieFinder movieFinder;@Autowired(required = false)public void setMovieFinder(MovieFinder movieFinder) {this.movieFinder = movieFinder;}// ...
}

将 required 属性设置为 false 表示,如果无法进行自动装配,将跳过非必需的注入点,不会调用对应的方法或设置字段。

特殊接口类型的注入

@Autowired 注解还可以用于诸如 BeanFactory、ApplicationContext、Environment 等 Spring 容器内置的接口类型。这些接口和它们的扩展接口无需额外配置,Spring 会自动解析它们。

public class MovieRecommender {@Autowiredprivate ApplicationContext context;// ...
}

异常处理

在实际应用中,如果无法匹配到候选 bean,@Autowired 注解将导致注入失败。对于构造函数和工厂方法参数的注入,required 属性有不同的含义。可以使用 Java 8 的 Optional、@Nullable 注解,或者在 Spring Framework 5.0 中使用 @Nullable 注解。

public class SimpleMovieLister {@Autowiredpublic void setMovieFinder(Optional<MovieFinder> movieFinder) {// ...}// 或者@Autowiredpublic void setMovieFinder(@Nullable MovieFinder movieFinder) {// ...}
}

结语

通过深入了解 @Autowired 注解的使用,你可以更灵活地进行依赖注入,提高代码的可读性和可维护性。选择合适的用法,可以使得 Spring 框架更好地服务于你的业务需求。

相关文章:

【Spring】19 @Autowired注解使用详解

文章目录 构造函数注入Setter方法注入字段注入数组和集合注入特殊情况处理特殊接口类型的注入异常处理结语 Spring 框架的 Autowired 注解是实现依赖注入的一种强大而灵活的方式。在本文中&#xff0c;我们将介绍 Autowired 注解的多种用法&#xff0c;包括构造函数、setter方法…...

Educational Codeforces Round 132 (Rated for Div. 2) E. XOR Tree(启发式合并+贪心)

题目 n(n<2e5)个点的树&#xff0c;点i权值ai&#xff08;1<ai<2^30&#xff09; 修改最少的点的权值&#xff0c;使得树上不存在异或和为0的简单路径&#xff0c;输出最少的点数 权值可以被修改成任意正整数&#xff08;可以是无限大&#xff09; 思路来源 官方…...

JavaScript 基本数据类型的详解

JavaScript的基本数据类型 以下都是JS内置的几种类型 数据类型描述number数字&#xff0c;不区分整数和小数string字符串类型booleantrue 真, false 假undefined表示未定义的值null只有唯一的值 null&#xff0c;表示空值 number 数字类型 JavaScript 中不区分整数和浮点数&…...

DDR5内存相比DDR4内存的优势和区别?选择哪一个服务器内存配置能避免丢包和延迟高?

根据幻兽帕鲁服务器的实际案例分析&#xff0c;选择合适的DDR4与DDR5内存大小以避免丢包和延迟高&#xff0c;需要考虑以下几个方面&#xff1a; 性能与延迟&#xff1a;DDR5内存相比DDR4在传输速率、带宽、工作电压等方面都有显著提升&#xff0c;但同时也伴随着更高的延迟。D…...

篮球游戏中的挑战精神与怄气心理:扣篮被帽后的再度冲击

在篮球比赛中&#xff0c;扣篮无疑是最具观赏性和震撼力的动作之一&#xff0c;它展示了球员的爆发力、技巧和自信。而在篮球游戏中&#xff0c;玩家即便面临连续扣篮被盖帽的挫折&#xff0c;仍渴望继续杀入内线尝试扣篮的现象&#xff0c;实则是体育竞技精神、挑战意识与怄气…...

JavaScript高级程序设计

前言 《JavaScript高级程序设计》 第1章——什么是JavaScript DOM将整个页面抽象为一组分层节点。 BOM用于支持访问和操作浏览器的窗口。 第2章——HTML中的JavaScript 2.1 < script >元素 元素描述async立即开始下载脚本&#xff0c;但不能阻止其他页面动作&#…...

初阶数据结构:栈与队列

目录 1. 简述&#xff1a;栈2. 栈的功能分析与实现2.1 功能分析2.2 栈的实现2.2.1 栈的结构创建与初始化2.2.2 压栈&#xff0c;出栈与判空&#xff1a;2.2.3 获取栈顶元素&#xff0c;检索栈的长度与栈的销毁 3. 简述&#xff1a;队列4. 队列的功能分析与实现4.1 队列的功能分…...

Houdini学习笔记

按住Alt / 空格 左键&#xff1a;进行旋转 按住Alt / 空格 中间&#xff1a;移动屏幕画面 按住Alt / 空格 右键&#xff1a;缩放视口 如果不要Alt&#xff0c;就先按ESC&#xff0c;再去左键、中键、右键操作 这里有对应的层级关系&#xff0c;类似于树形结构&#xff…...

电销机器人识别客户情绪状态

最近有电销机器人需求的客户咨询我&#xff0c;你们OKCC的机器人可以识别客户的情绪变化吗&#xff1f;别人说目前电销机器人系统有支持的。 首先还是从原理的角度解答一下&#xff0c;是否能识别情绪状态。 是的&#xff0c;电销机器人可以识别客户的情绪状态。这可以通过语音…...

AI推介-大语言模型LLMs论文速览(arXiv方向):2024.02.25-2024.03.01

论文目录~ 1.Arithmetic Control of LLMs for Diverse User Preferences: Directional Preference Alignment with Multi-Objective Rewards2.Keeping LLMs Aligned After Fine-tuning: The Crucial Role of Prompt Templates3.Meta-Task Prompting Elicits Embedding from Lar…...

Cesium插件系列——3dtiles压平

本系列为自己基于cesium写的一套插件具体实现。 这里是根据Cesium提供的CustomShader来实现的。 在CustomShader的vertexShaderText里&#xff0c;需要定义vertexMain函数&#xff0c;例如下&#xff1a; struct VertexInput {Attributes attributes;FeatureIds featureIds;…...

APS面试审核准备的常规问题

之前根据其他人的经验贴&#xff0c;准备了一些可能APS 面试审核可能会遇到的常规问题&#xff0c;现在简单分享一下。 一般会考虑到留学资金来源&#xff0c;在德国能不能顺利毕业&#xff1b;学的是什么专业内容之类的&#xff0c;判断去德国会不会好好学习&#xff1b;对德国…...

jvm 基础知识和jvm 调优

类装载分为以下 5 个步骤&#xff1a; 加载&#xff1a;根据查找路径找到相应的 class 文件然后导入&#xff1b; 检查&#xff1a;检查加载的 class 文件的正确性&#xff1b; 准备&#xff1a;给类中的静态变量分配内存空间&#xff1b; 解析&#xff1a;虚拟机将常量池中的符…...

USB4之ASM2464PD与ASM2464PDX兼容与运用

首先在NVMe上运用: 一&#xff1a;ASM2464PD&#xff08;现在可以做带PD的方案&#xff09; 二&#xff1a;ASM2464PDX 1&#xff1a; Application Guide- CFX card reader NVMe SSD 2&#xff1a;ASM2464PDX Application Guide- NVMe SSD x4 with data clone 三&#xff…...

python笔记_进制

二进制 进位规则&#xff1a;满2进1 范围&#xff1a;0,1 符号&#xff1a;以0b和0B开头 八进制 进位规则&#xff1a;满8进1 范围&#xff1a;0-7 符号&#xff1a;以0o和0O开头 十进制 进位规则&#xff1a;满10进1 范围&#xff1a;0-9 十六进制 进位规则&#xff…...

面试数据库篇(mysql)- 05什么是聚簇索引什么是非聚簇索引

聚集索引选取规则: 如果存在主键&#xff0c;主键索引就是聚集索引。如果不存在主键&#xff0c;将使用第一个唯一&#xff08;UNIQUE&#xff09;索引作为聚集索引。如果表没有主键&#xff0c;或没有合适的唯一索引&#xff0c;则InnoDB会自动生成一个rowid作为隐藏的聚集索…...

如何开好一家汽车美容店,汽车美容保养与装饰教学

一、教程描述 本套教程共由17张VCD组合而成&#xff0c;教程内容主要包括&#xff1a;美容店的设立和管理&#xff0c;汽车系统与内部结构&#xff0c;汽车美容工具与美容设备&#xff0c;美容用品的选择与使用&#xff0c;车身打蜡镀膜与内外清洁&#xff0c;车身抛光与漆面处…...

Taro + node.js 注册 仿照java 中的加盐算法

1.需求 为了让用户的密码更加保密 我们在md5 之前 在加一个随机数 用java 的说法 叫做 加盐算法 2.代码 //H5注册async H5Register(register) {if (!register.phone ||!register.password ||!register.confirmPassword ||!register.yzmCode ||!register.registerCode) {thr…...

全量知识系统问题及SmartChat给出的答复 之9 三套工具之4语法解析器 之2

Q23. 一个语言的语法简约规则 这些规则显示show 在一个给定单词&#xff08;a given word&#xff09;的右边或左边可能出现的单词的类别。句型的多样性variety不是复杂文法&#xff08;a complex grammar&#xff09;的结果&#xff0c;而是简单语法&#xff08;a simple gra…...

简洁版用户登录系统

前端页面&#xff1a; 用户登录首页&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximu…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...