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

【Spring】21 通过@Primary注解优化注解驱动的自动装配

文章目录

      • @Primary注解简介
      • 优势和适用场景
      • 小结

Spring 框架提供了强大的依赖注入机制,其中 @Autowired 注解是一种常用的方式。然而,当存在多个候选 bean 时,通过类型自动装配可能导致选择困难。为了更好地控制这一过程,Spring 引入了 @Primary 注解,允许我们明确指定哪个 bean 在存在多个候选 bean 时应该被优先注入。

@Primary注解简介

@Primary 注解用于表示特定的 bean 应在存在多个候选 bean 时优先注入。如果在候选 bean 中存在唯一的主bean,它将成为自动装配的值。这提供了对自动装配过程更细粒度的控制。

考虑以下配置示例,其中 firstMovieCatalog 被指定为主要 MovieCatalog:

@Configuration
public class MovieConfiguration {@Bean@Primarypublic MovieCatalog firstMovieCatalog() { ... }@Beanpublic MovieCatalog secondMovieCatalog() { ... }// ...
}

在上述配置中,MovieRecommender 将自动注入 firstMovieCatalog:

public class MovieRecommender {@Autowiredprivate MovieCatalog movieCatalog;// ...
}

相应的 XML 配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/><bean class="example.SimpleMovieCatalog" primary="true"><!-- inject any dependencies required by this bean --></bean><bean class="example.SimpleMovieCatalog"><!-- inject any dependencies required by this bean --></bean><bean id="movieRecommender" class="example.MovieRecommender"/></beans>

优势和适用场景

使用 @Primary 注解的主要优势在于提供了对自动装配过程更精细的控制。通过明确指定主 bean,我们可以避免因为存在多个候选 bean 而导致的不确定性。

适用场景包括但不限于以下情况:

  1. 默认选择主bean: 当存在多个实现某一接口的 bean 时,通过 @Primary 注解可以指定默认选择哪一个bean,避免手动指定。
  2. 简化配置: 在某些情况下,我们可能希望在存在多个相似的 bean 时,自动选择一个默认的主 bean,而不需要显式指定。
  3. 提高可读性: 通过 @Primary 注解,代码表达更清晰,读者可以迅速理解哪个 bean 在多个候选 bean 中具有优先权。

小结

通过 @Primary 注解,我们可以在存在多个候选 bean 时明确指定哪一个应该被优先注入。这在简化配置、提高可读性和默认选择主 bean 方面都具有优势。在实际应用中,根据具体情况灵活运用 @Primary 注解,能够更好地发挥 Spring 框架的依赖注入特性。

相关文章:

【Spring】21 通过@Primary注解优化注解驱动的自动装配

文章目录 Primary注解简介优势和适用场景小结 Spring 框架提供了强大的依赖注入机制&#xff0c;其中 Autowired 注解是一种常用的方式。然而&#xff0c;当存在多个候选 bean 时&#xff0c;通过类型自动装配可能导致选择困难。为了更好地控制这一过程&#xff0c;Spring 引入…...

【HTML】HTML基础7.3(自定义列表)

目录 标签 效果 代码 注意 标签 <dl> <dt>自定义标题</dt><dd>内容1</dd><dd>内容2</dd><dd>内容3</dd> 。。。。。。 </dl> 效果 代码 <dl><dt>蜘蛛侠系列</dt><dd>蜘蛛侠1</dd…...

java设计模式课后作业(待批改)

此文章仅记录学习&#xff0c;欢迎各位大佬探讨 实验&#xff08;一&#xff09; 面向对象设计 实验目的 ①使用类来封装对象的属性和功能&#xff1b; ②掌握类变量与实例变量&#xff0c;以及类方法与实例方法的区别&#xff1b; 知识回顾 详情见OOP课件 实验内容…...

qt 语音引擎 QTextToSpeech Microsoft SAPI

QT中语音播报的代码 在QT中实现语音播报可以使用QTextToSpeech类&#xff0c;具体代码如下&#xff1a; #include <QCoreApplication> #include <QTextToSpeech> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创…...

react hook: useimperativeHandle

通过 useImperativeHandle&#xff0c;子组件可以选择性地暴露给父组件某些属性或方法&#xff0c;而不是将所有属性和方法暴露出去。 父组件 获得自组件的 ref&#xff0c;就能通过该 ref 来调用 focus来聚焦等功能 在 forwardRef 包装的组件中&#xff0c;ref 固定地是第二个…...

30天自制操作系统(第28天)

28.1 alloca __alloca 会在下述情况下被 C 语言的程序调用&#xff08;采用 near-CALL 的方式&#xff09;。 1、要执行的操作从栈中分配 EAX 个字节的内存空间&#xff08; ESP - EAX; &#xff09; 2、要遵守的规则不能改变 ECX 、 EDX 、 EBX 、 EBP 、 ESI 、 EDI的值&am…...

Nginx启动服务

Nginx启动服务 一、启动前置 下载地址 如已安装Docker&#xff0c;下一步拉取Nginx最新的Docker镜像&#xff1a; docker pull nginx:latest查看拉取下来的镜像&#xff1a; docker images二、启动服务 创建Docker容器&#xff1a; docker run --name {projectname} -p 80…...

coqui-ai/TTS 案例model文件

GitHub - coqui-ai/TTS: &#x1f438;&#x1f4ac; - a deep learning toolkit for Text-to-Speech, battle-tested in research and production Coqui AI的TTS是一款开源深度学习文本转语音工具&#xff0c;以高质量、多语言合成著称。它提供超过1100种语言的预训练模型库&…...

如何利用API接口进行高效的商品变体管理?

要利用API接口进行高效的商品变体管理&#xff0c;您需要执行一系列策略和技术步骤来确保数据的准确性和实时性。以下是详细的指南&#xff1a; 1. 确定变体管理需求 分析产品&#xff1a;识别具有变体的产品&#xff0c;并明确这些变体的属性&#xff08;如尺寸、颜色、材质…...

扼杀网络中的环路:STP、RSTP、MSTP

目录 前言&#xff1a; 一、STP&#xff08;Spanning Tree Protocol&#xff09; 1.1 STP功能 1.2 STP应用 二、RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09; 2.1 RSTP功能 2.2 RSTP应用 三、MSTP&#xff08;Multiple Spanning Tree Protocol&#xff0…...

青少年如何从零开始学习Python编程?有它就够了!

文章目录 写在前面青少年为什么要学习编程 推荐图书图书特色内容简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家带来一本非常适合青少年学习编程的图书&#xff0c;快来看看吧~ 青少年为什么要学习编程 青少年学习编程&#xff0c;就好比在他们年轻时就开始掌握一种…...

触发HTTP preflight预检及跨域的处理方法

最近在做需求的过程中&#xff0c;遇到了很多跨域和HTTP预检的问题。下面对我所遇到过的HTTP preflight和跨域的相关问题进行总结&#xff1a; 哪些情况会触发HTTP preflight preflight属于cors规范的一部分&#xff0c;在有跨域的时候&#xff0c;在一定情况下会触发preflig…...

【算法可视化】搜索算法专题

运行平台 Algorithm Visualizer 选数 [NOIP2002 普及组] 选数 // 导入可视化库 { const { Tracer, Array1DTracer, LogTracer, Layout, VerticalLayout } require(algorithm-visualizer); // }const N 4, K 3; //从包含4个元素的集合中选出3个数 let ans 0 //方案数 co…...

编写dockerfile挂载卷、数据容器卷

编写dockerfile挂载卷 编写dockerfile文件 [rootwq docker-test-volume]# vim dockerfile1 [rootwq docker-test-volume]# cat dockerfile1 FROM centosVOLUME ["volume01","volume02"]CMD echo "------end------" CMD /bin/bash [rootwq dock…...

理解OAuth 2.0

OAuth是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;在全世界得到广泛应用&#xff0c;目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程&#xff0c;做一个简明通俗的解释&#xff0c;主要参考材料为RFC 6749。 一、应用场景 为了…...

8. Go实现Gin服务优雅关机与重启

文章目录 优雅关机优雅重启 无论是优雅关机还是优雅重启归根结底都是通过监听特定系统信号&#xff0c;然后执行一定的逻辑处理保障当前系统正在处理的请求被正常处理后再关闭当前进程。 优雅关机 优雅关机就是服务端关机命令发出后不是立即关机&#xff0c;而是等待当前还在…...

SQL 注入攻击 - cookie base64编码注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、Base64编码介绍 原理 Base64编码的原理是将三个字节的二进制数据(共24位)转换成四个ASCII字符。由于每个ASCII字符可以表示64种状态(2^6),刚好可以用来表示24位二进制数…...

Outlook邮箱后缀如何修改?怎么添加后缀?

Outlook邮箱后缀是什么&#xff1f;Outlook邮箱后缀可以改吗&#xff1f; Outlook邮箱广泛应用于企业和个人用户之间。在使用过程中&#xff0c;有时我们可能会因为某些原因需要修改Outlook邮箱后缀。那么&#xff0c;Outlook邮箱后缀如何修改呢&#xff1f;下面&#xff0c;A…...

[LeetBook]【学习日记】图书整理 II——用两个栈实现队列

题目 图书整理 II 读者来到图书馆排队借还书&#xff0c;图书管理员使用两个书车来完成整理借还书的任务。书车中的书从下往上叠加存放&#xff0c;图书管理员每次只能拿取书车顶部的书。排队的读者会有两种操作&#xff1a; push(bookID)&#xff1a;把借阅的书籍还到图书馆。…...

5G智能制造食品工厂数字孪生可视化平台,推进食品行业数字化转型

5G智能制造食品工厂数字孪生可视化平台&#xff0c;推进食品行业数字化转型。随着科技的飞速发展&#xff0c;食品工业正迎来一场前所未有的数字化转型。在这场转型中&#xff0c;5G智能制造工厂数字孪生可视化平台发挥着至关重要的作用。它不仅提高了生产效率&#xff0c;降低…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…...