Spring注解@Primary使用概述

在声明bean的时候,通过将其中一个可选的bean设置为首选
描述:在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种。这种情况下 @Primary 的作用就出来了。下面是个简单的使用例子。

  1. public interface Worker {
  2. public String work();
  3. }
  4. @Component
  5. public class Singer implements Worker {
  6. @Override
  7. public String work() {
  8. return "歌手的工作是唱歌";
  9. }
  10. }
  11. @Component
  12. public class Doctor implements Worker {
  13. @Override
  14. public String work() {
  15. return "医生工作是治病";
  16. }
  17. }
  18. // 启动,调用接口
  19. @SpringBootApplication
  20. @RestController
  21. public class SimpleWebTestApplication {
  22. @Autowired
  23. private Worker worker;
  24. @RequestMapping("/info")
  25. public String getInfo(){
  26. return worker.work();
  27. }
  28. public static void main(String[] args) {
  29. SpringApplication.run(SimpleWebTestApplication.class, args);
  30. }
  31. @Component
  32. //将这个bean做为 多个接口实现Bean的首选
  33. @Primary
  34. public class Doctor implements Worker {
  35. @Override
  36. public String work() {
  37. return "医生工作是治病";
  38. }
  39. }

当一个接口有多个实现,且通过@Autowired注入属性,由于@Autowired是通过byType形式,用来给指定的字段或方法注入所需的外部资源。Spring无法确定具体注入的类(有多个实现,不知道选哪个),启动会报错并提示:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed。
当给指定的组件添加@Primary是,默认会注入@Primary配置的组件。