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

文章目录

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

@Primary注解简介

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

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

java 复制代码
@Configuration
public class MovieConfiguration {

    @Bean
    @Primary
    public MovieCatalog firstMovieCatalog() { ... }

    @Bean
    public MovieCatalog secondMovieCatalog() { ... }

    // ...
}

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

java 复制代码
public class MovieRecommender {

    @Autowired
    private MovieCatalog movieCatalog;

    // ...
}

相应的 XML 配置如下:

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/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://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 框架的依赖注入特性。

相关推荐
SL_staff几秒前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays10117 分钟前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找
geats人山人海17 分钟前
java 4继承
java·开发语言
行百里er30 分钟前
Redis 模块——JSON、向量搜索与时序
redis·后端
众链网络40 分钟前
Agent 的成本大头不在“写“,在“判断“:拆解专用决策模型的三层架构
java·开发语言·人工智能·微服务
周小董42 分钟前
[1371]jdk管理工具
java·开发语言
青春逝如流水1 小时前
Java 中线程的创建方式:从基础到现代
java·开发语言·多线程·ai文章
Peregrine92 小时前
C++ - > 类和对象
java·c++·算法
一条泥憨鱼2 小时前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
2501_933923252 小时前
SpringCloud组件:Eureka服务注册与发现
java·开发语言·后端·spring cloud·eureka