当前位置: 首页 > 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 框架的依赖注入特性。

http://www.lryc.cn/news/312742.html

相关文章:

  • 【HTML】HTML基础7.3(自定义列表)
  • java设计模式课后作业(待批改)
  • qt 语音引擎 QTextToSpeech Microsoft SAPI
  • react hook: useimperativeHandle
  • 30天自制操作系统(第28天)
  • Nginx启动服务
  • coqui-ai/TTS 案例model文件
  • 如何利用API接口进行高效的商品变体管理?
  • 扼杀网络中的环路:STP、RSTP、MSTP
  • 青少年如何从零开始学习Python编程?有它就够了!
  • 触发HTTP preflight预检及跨域的处理方法
  • 【算法可视化】搜索算法专题
  • 编写dockerfile挂载卷、数据容器卷
  • 理解OAuth 2.0
  • 8. Go实现Gin服务优雅关机与重启
  • SQL 注入攻击 - cookie base64编码注入
  • Outlook邮箱后缀如何修改?怎么添加后缀?
  • [LeetBook]【学习日记】图书整理 II——用两个栈实现队列
  • 5G智能制造食品工厂数字孪生可视化平台,推进食品行业数字化转型
  • 一个系列很多样式的wordpress外贸建站模板
  • Wireshark_labs TCP
  • Linux程序崩溃调试
  • Day37 socket、TCP、UDP
  • 从 Language Model 到 Chat Application:对话接口的设计与实现
  • 无人机|LQR控制算法及其无人机控制中的应用仿真
  • ubuntu环境下docker容器详细安装使用
  • vue2源码分析-vue入口文件global-api分析
  • Javascript原型 ,原型链如何理解使用 ?有什么特点?
  • Flutter混合栈管理方案对比
  • Asp .Net Core 集成 Newtonsoft.Json