【spring】@Primary注解学习

@Primary介绍

@Primary 是 Spring 框架中的一个注解,用于在多个相同类型的 bean 中指定一个默认的 bean。当 Spring 容器在自动装配时遇到类型冲突,即存在多个相同类型的 bean 时,如果没有使用 @Qualifier 或其他方式指定具体的 bean,Spring 会自动选择标记有 @Primary 的 bean 进行注入。

@Primary源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Primary {

}
源代码截图

@Primary属性介绍

没有属性,哈哈!!

@Primary注解使用场景

  1. 默认 bean 选择:当 Spring 容器中有多个相同类型的 bean 时,如果不指定具体的 bean,Spring 在自动装配时可能会因为歧义而无法确定应该注入哪个 bean。使用 @Primary 可以指定一个 bean 作为默认选择,这样在没有其他指定的情况下,Spring 会自动注入这个 bean。

  2. 简化配置:在某些情况下,你可能希望在多个相同类型的 bean 中指定一个默认的 bean,以便在大多数情况下不需要显式指定 bean。使用 @Primary 可以简化配置,减少代码的复杂性。

  3. 与 @Qualifier 结合使用:在某些情况下,你可能希望在多个相同类型的 bean 中指定一个默认的 bean,但在某些特殊情况下需要使用其他 bean。使用 @Primary 可以指定一个默认的 bean,而在特殊情况下使用 @Qualifier 来指定具体的 bean。

  4. 在配置类中使用:除了在 bean 的属性或构造函数上使用 @Primary,你还可以在配置类中使用 @Primary 来指定 bean 的名称或限定符,以便在其他 bean 中使用。

  5. 与 @Component@Service@Repository 等注解结合使用:在定义 bean 时,可以使用 @Primary 来指定一个 bean 作为默认选择,以便在其他 bean 中使用。

  6. 在 @Bean 注解中使用:在 @Configuration 类中,你可以使用 @Bean 注解来定义 bean,并使用 @Primary 来指定 bean 作为默认选择,以便在其他 bean 中使用。

@Primary测试示例代码

示例代码 一:多个实现类的自动装配
@Service
public class DefaultEmailSender implements EmailSender {
    // ...
}

@Service
public class SmsEmailSender implements EmailSender {
    // ...
}

@Configuration
public class AppConfig {
    @Bean
    @Primary
    public EmailSender emailSender() {
        return new DefaultEmailSender();
    }

    @Bean
    public EmailSender smsEmailSender() {
        return new SmsEmailSender();
    }
}
示例代码 二:配置类中的方法注入
@Configuration
public class WebConfig {
    @Bean
    public WebService webService() {
        return new WebService();
    }

    @Bean
    @Primary
    public SecureWebService secureWebService() {
        return new SecureWebService();
    }
}
示例代码 三:优先级链的使用
@Service
@Profile("dev")
public class DevNotificationService implements NotificationService {
    // ...
}

@Service
@Primary
@Profile("prod")
public class ProdNotificationService implements NotificationService {
    // ...
}

在这个例子中,DevNotificationService将在开发环境(dev profile)中作为首选,而ProdNotificationService将在生产环境(prod profile)中作为首选。




相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-30 07:02:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-30 07:02:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-30 07:02:04       87 阅读
  4. Python语言-面向对象

    2024-03-30 07:02:04       96 阅读

热门阅读

  1. ARM.day8

    2024-03-30 07:02:04       39 阅读
  2. 怎么使用vuex的数据和方法

    2024-03-30 07:02:04       36 阅读
  3. 使用VHDL实现俄罗斯方块游戏设计

    2024-03-30 07:02:04       44 阅读
  4. PyTorch中的flatten+transpose函数说明

    2024-03-30 07:02:04       46 阅读
  5. 使用Dom4j解析多层级XML为Map对象

    2024-03-30 07:02:04       39 阅读
  6. 【threejs】计算矩阵、网格等总面积

    2024-03-30 07:02:04       46 阅读
  7. spark DataFrame通过JDBC读写数据库(MySQL示例)

    2024-03-30 07:02:04       36 阅读
  8. npm包发布

    2024-03-30 07:02:04       40 阅读
  9. Node.js常用命令详解

    2024-03-30 07:02:04       40 阅读
  10. 在axios中设置方法防止http重复请求

    2024-03-30 07:02:04       37 阅读
  11. SqlSugar快速入门

    2024-03-30 07:02:04       42 阅读
  12. qt之windows库编译

    2024-03-30 07:02:04       47 阅读
  13. MYSQL分区

    2024-03-30 07:02:04       38 阅读