Java Spring

@Qualifier的作用

这是官方的介绍

This annotation may be used on a field or parameter as a qualifier for candidate beans when autowiring. It may also be used to annotate other custom annotations that can then in turn be used as qualifiers.

简单的理解就是:
(1)在使用@Autowire自动注入的时候,加上@Qualifier("test")可以指定注入哪个对象;
(2)可以作为筛选的限定符,在做自定义注解时可以在其定义上增加@Qualifier,用来筛选需要的对象。这个理解看下面的代码吧,不好解释。

功能介绍

首先是对(1)的理解。

  1. //定义了两个TestClass对象,分别是testClass1和testClass2
  2. //如果在另外一个对象中直接使用@Autowire去注入的话,spring肯定不知道使用哪个对象
  3. //会排除异常 required a single bean, but 2 were found
  4. @Configuration
  5. public class TestConfiguration {
  6. @Bean("testClass1")
  7. TestClass testClass1(){
  8. return new TestClass("TestClass1");
  9. }
  10. @Bean("testClass2")
  11. TestClass testClass2(){
  12. return new TestClass("TestClass2");
  13. }
  14. }

下面是正常的引用

  1. @RestController
  2. public class TestController {
  3. //此时这两个注解的连用就类似 @Resource(name="testClass1")
  4. @Autowired
  5. @Qualifier("testClass1")
  6. private TestClass testClass;
  7. @GetMapping("/test")
  8. public Object test(){
  9. return testClassList;
  10. }
  11. }

@Autowired@Qualifier这两个注解的连用在这个位置就类似 @Resource(name="testClass1")
对(2)的理解

  1. @Configuration
  2. public class TestConfiguration {
  3. //调整下在testClass1上增加@Qualifier注解
  4. @Qualifier
  5. @Bean("testClass1")
  6. TestClass testClass1(){
  7. return new TestClass("TestClass1");
  8. }
  9. @Bean("testClass2")
  10. TestClass testClass2(){
  11. return new TestClass("TestClass2");
  12. }
  13. }
  14. @RestController
  15. public class TestController {
  16. //这里使用一个list去接收testClass的对象
  17. @Autowired
  18. List<TestClass> testClassList= Collections.emptyList();
  19. @GetMapping("/test")
  20. public Object test(){
  21. return testClassList;
  22. }
  23. }

调用得到的结果是

  1. [
  2. {
  3. "name": "TestClass1"
  4. },
  5. {
  6. "name": "TestClass2"
  7. }
  8. ]

可以看到所有的testclass都获取到了。接下来修改下代码

  1. @RestController
  2. public class TestController {
  3. @Qualifier //在这增加注解
  4. @Autowired
  5. List<TestClass> testClassList= Collections.emptyList();
  6. @GetMapping("/test")
  7. public Object test(){
  8. return testClassList;
  9. }
  10. }

和上面代码对比就是在接收参数上增加了@Qualifier注解,这样看是有什么区别,调用下,结果如下:

  1. [
  2. {
  3. "name": "TestClass1"
  4. }
  5. ]

返回结果只剩下增加了@Qualifier注解的TestClass对象,这样就可以理解官方说的标记筛选是什么意思了。另外,@Qualifier注解是可以指定value的,这样可以通过values来分类筛选想要的对象了。