1.概述

讨论Spring的@Primary注解,该注解是框架在3.0版中引入的。

其作用与功能,当有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级。

2.为什么需要@Primary?

在某些情况下,需要注册多个相同类型的bean。

在此示例中,有Employee类型的zhangSanEmployee()和liSiEmployee()Bean:

@Configuration
public class PrimaryConfig {@Beanpublic Employee zhangSanEmployee() {return new Employee("张三");}@Beanpublic Employee liSiEmployee() {return new Employee("李四");}
}

如果尝试运行应用程序,与@Autowired一起应用于注入。Spring会抛出NoUniqueBeanDefinitionException。

要访问相同类型的bean,常使用@Qualifier(“beanName”)注解,通过别名控制访问相同类型。

@Configuration
public class PrimaryConfig {@Bean@Qualifier("zhangSanEmployee")public Employee zhangSanEmployee() {return new Employee("张三");}@Bean@Qualifier("liSiEmployee")public Employee liSiEmployee() {return new Employee("李四");}
}

注入

@Resource
private Employee zhangSanEmployee;@Resource
private Employee liSiEmployee;

3.将@Primary和@Bean一起使用

看一下配置类:

@Configuration
public class PrimaryConfig {@Beanpublic Employee zhangSanEmployee() {return new Employee("张三");}@Bean@Primarypublic Employee liSiEmployee() {return new Employee("李四");}
}

用@Primary标记liSiEmployee()bean。 Spring将优先于zhangSanEmployee()注入liSiEmployee()bean。

@Test
public void test1() {AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(PrimaryConfig.class);Employee employee = context.getBean(Employee.class);System.out.println(employee);//Employee(name=李四)}

4.将@Primary与@Component一起使用

可以直接在bean上使用@Primary。

public interface Manager {String getManagerName();
}

有一个Manager接口和两个子类bean

@Component
public class DepartmentManager implements Manager {@Overridepublic String getManagerName() {return "Department manager";}
}
@Component
@Primary
public class GeneralManager implements Manager {@Overridepublic String getManagerName() {return "General manager";}
}

都覆盖Manager接口的getManagerName()。 另外,请注意,用@Primary标记了GeneralManager bean。

@Service
public class ManagerService {@Autowiredprivate Manager manager;public Manager getManager() {return manager;}
}

测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class PrimaryTest {@Resourceprivate ApplicationContext context;@Testpublic void test2() {ManagerService service = context.getBean(ManagerService.class);Manager manager = service.getManager();System.out.println(manager.getManagerName());//General manager}
}

Spring中@Primary注解相关推荐

  1. Spring中异步注解@Async的使用、原理及使用时可能导致的问题

    前言 最近,很多同学碰到了下面这个问题,添加了Spring提供的一个异步注解@Async循环依赖无法被解决了,下面是一些读者的留言跟群里同学碰到的问题: 本着讲一个知识点就要讲明白.讲透彻的原则,我决 ...

  2. Spring中常用注解的介绍

    spring中使用注解时配置文件的写法: <?xml version="1.0" encoding="UTF-8"?> <span style ...

  3. 声明式事务、Spring 中常用注解、Ajax

    五. 声明式事务 编程式事务: 1.1 由程序员编程事务控制代码. 1.2 OpenSessionInView 编程式事务 声明式事务: 先引入依赖 <dependency><gro ...

  4. spring中的注解和xml配置文件中配置对应总结

    spring中的注解和xml配置文件中配置对应 需要导入的jar spring-context spring-context-support spring-test commons-logging b ...

  5. Spring中@AliasFor注解的作用及原理

    本文基于Springboot 2.1.6.RELEASE 版本分析. 关于@AliasFor注解,曾提过的一个issue Explicit attribute overrides configured ...

  6. Spring中@Value注解详解

    在spring项目中必不可少的就是读取配置文件,那么读取配置文件就有两种方式.一种就是使用Spring中@Value注解,还有一种是使用SpringBoot中的@ConfigurationProper ...

  7. spring中自定义注解(annotation)与AOP中获取注解___使用aspectj的@Around注解实现用户操作和操作结果日志

    spring中自定义注解(annotation)与AOP中获取注解 一.自定义注解(annotation) 自定义注解的作用:在反射中获取注解,以取得注解修饰的类.方法或属性的相关解释. packag ...

  8. Spring 中所有注解

    Spring中的注解主要分为两类: 类级别的注解: 如@Component.@Repository.@Controller.@Service以及JavaEE6的@ManagedBean和@Named注 ...

  9. Spring框架中@Primary注解的作用

    @Primary注解 @Primary的作用就是当一个接口存在多个实现类时,我们就可以通过@Primary注解来指明哪个实现类作为首选进行自动装配注入. 如果不加@Primary注解,接口ICarSe ...

最新文章

  1. 用python爬取网站数据期末作业_python实战第一周作业:爬取一页商品数据
  2. 计划策略-10-净需求计划
  3. native react 常用指令_React Native入门基础篇(一)
  4. BABOK - 需求管理和沟通(Requirements Management and Communication)概要
  5. Mybaits-plus实战(二)
  6. 直播预告:电力行业互联网改革思路与应对方案
  7. java取消 验证_使用Spring Security Java配置时禁用基本身份验证
  8. 设计模式详解(链接)
  9. 分享20个Android游戏源码,希望大家喜欢哈!
  10. 服务器动态文档技术——CGI、Servlet技术、动态页面Web
  11. C语言字节对齐规则总结
  12. 支付回答——如何理解借记和贷记
  13. 10万一平米的北京房价是如何让清华天才陨落的?
  14. ajax 一个完整的ajax请求
  15. 功利主义穆勒思维导图_穆勒功利主义读书笔记
  16. Python《机器学习实战》读书笔记(四)——朴素贝叶斯
  17. Unity流水账2:视频播放之Video Player
  18. c语言别踩白块小游戏代码,自学easeljs 根据别踩白块游戏规则自己写的代码
  19. 【编译原理】Up-Down-算符优先分析
  20. 错别字检查工具的准确性和适用性对比分析

热门文章

  1. Java 能创建多少线程
  2. 我的成神之路!Python 兵器谱(绝世神兵!收藏必备!)
  3. 创宇技能表_知道创宇研发技能表v3.0 来了!
  4. Cannot render error page for request [/list.html] and exception [An error happened during template p
  5. 各种LED显示模组的技术分析(1)扫描接口
  6. HTTP 协议中GET和POST到底有哪些区别
  7. GDAL python教程基础篇(4)OGR拷贝方法
  8. Seo:如何搜索搜索网站热点关键词和网站长尾关键词的特点和优势
  9. CSS写的青色漂亮导航菜单代码
  10. AOSP 8.0 系统启动之四ART虚拟机启动(一)