@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)的理解。
//我們定義了兩個TestClass對象,分別是testClass1和testClass2
//我們如果在另外一個對象中直接使用@Autowire去注入的話,spring肯定不知道使用哪個對象
//會排除異常 required a single bean, but 2 were found
@Configuration
public class TestConfiguration {
@Bean("testClass1")
TestClass testClass1(){
return new TestClass("TestClass1");
}
@Bean("testClass2")
TestClass testClass2(){
return new TestClass("TestClass2");
}
}
下面是正常的引用
@RestController
public class TestController {
//此時這兩個注解的連用就類似 @Resource(name="testClass1")
@Autowired
@Qualifier("testClass1")
private TestClass testClass;
@GetMapping("/test")
public Object test(){
return testClassList;
}
}
@Autowired和@Qualifier這兩個注解的連用在這個位置就類似 @Resource(name=“testClass1”)
- 對(2)的理解
@Configuration
public class TestConfiguration {
//我們調整下在testClass1上增加@Qualifier注解
@Qualifier
@Bean("testClass1")
TestClass testClass1(){
return new TestClass("TestClass1");
}
@Bean("testClass2")
TestClass testClass2(){
return new TestClass("TestClass2");
}
}
@RestController
public class TestController {
//我們這里使用一個list去接收testClass的對象
@Autowired
List<TestClass> testClassList= Collections.emptyList();
@GetMapping("/test")
public Object test(){
return testClassList;
}
}
我們調用得到的結果是
[
{
"name": "TestClass1"
},
{
"name": "TestClass2"
}
]
我們可以看到所有的testclass都獲取到了。接下來我們修改下代碼
@RestController
public class TestController {
@Qualifier //我們在這增加注解
@Autowired
List<TestClass> testClassList= Collections.emptyList();
@GetMapping("/test")
public Object test(){
return testClassList;
}
和上面代碼對比就是在接收參數上增加了@Qualifier注解,這樣看是有什么區別,我們調用下,結果如下:
[
{
"name": "TestClass1"
}
]
返回結果只剩下增加了@Qualifier注解的TestClass對象,這樣我們就可以理解官方說的標記篩選是什么意思了。
另外,@Qualifier注解是可以指定value的,這樣我們可以通過values來分類篩選想要的對象了,這里不列舉代碼了,感興趣的同學自己試試。