@Qualifier的作用和應用


@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來分類篩選想要的對象了,這里不列舉代碼了,感興趣的同學自己試試。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM