Spring中的@Autowired、@Qualifier和@Primary注解詳解
1. @Autowired 注解
1.1. @Autowired 注解的使用
@Autowired 注解,可以對類成員變量、方法和構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動裝配的工作
1.1.1. 類成員變量上(較為常用)
@Controller public class SoakController { @Autowired private SoakService soakService; }
1.1.2. 用在方法上
@Controller public class SoakController { private SoakService soakService; @Autowired public void setSoakService(SoakService soakService) { this.soakService = soakService; } }
1.1.3. 用在構(gòu)造器上
@Controller public class SoakController { private SoakService soakService; @Autowired public SoakController(SoakService soakService) { this.soakService = soakService; } }
1.1.4. 用在參數(shù)上
@Controller public class SoakController extends BaseController { private SoakService soakService; public SoakController(@Autowired SoakService soakService) { this.soakService = soakService; } }
1.2. @Autowired 注解的說明
- 默認(rèn)優(yōu)先按照 byType 去容器中找對應(yīng)的組件,找到就賦值
- 如果找到多個相同類型的組件,再通過 byName 來到 IOC 容器中進(jìn)行查找
- 默認(rèn)情況下,它具有強(qiáng)制契約特性,其所標(biāo)注的屬性必須是可裝配的。如果沒有 bean 可以裝配到 @Autowired 所標(biāo)注的屬性或參數(shù)中,那么你會看到 org.springframework.beans.factory.NoSuchBeanDefinitionException 的異常信息
2. @Autowired 配合 @Qualifier
- @Autowired 是默認(rèn)根據(jù) byType 進(jìn)行自動裝配的,如果需要按 byName 進(jìn)行裝配,則需要配合 @Qualifier 注解使用
- 如果容器中存在多個相同類型的組件,此時需要通過 byName 來進(jìn)行裝配,則需要配合 @Qualifier 注解使用
組件 1
@Service public class BookService {// 類型為 BookService,name 為 bookService }
組件 2
@Configuration public class MainConfigOfAutowired { // 類型為 BookService,name 為 bookService01 @Bean public BookService bookService01() { return new BookService(); } }
測試
@Autowired @Qualifier("bookService01") private BookService bookService; @Test public void MyTest() { System.out.println(bookService); }
由于容器中存在 bookService01 和 bookService 兩個類型相同的組件 bean,那么此時可以使用 @Qualifier(“bookService01”) 明確指定 bean 的 name 后,@Autowired 不再根據(jù) byType 自動裝配了,而用 bookService01 作為組件的 name 去容器中查找,找到組件 2,裝配成功
3. @Autowired 配合 @Primary
- Spring 在進(jìn)行自動裝配的時候,會 優(yōu)先 使用用 @Primary 標(biāo)注指定的 bean
- 如果容器中有多個組件 Type 類型相同,注入的 bean 的 Name 名稱也相同,那么此時就可以使用 @Primary 注解,將某一個組件 優(yōu)先 注入
- 不能把多個 bean 都標(biāo)注為 @Primary,不然你會得到 NoUniqueBeanDefinitionException 這個異常
組件 1
@Service public class BookService { // 類型為 BookService,name 為 bookService }
組件 2
@Configuration public class MainConfigOfAutowired { // 類型為 BookService,name 為 bookService01 @Primary @Bean public BookService bookService01() { return new BookService(); } }
測試 1
@Autowired private BookService bookService; @Test public void MyTest() { System.out.println(bookService); }
因?yàn)榻M件 2 使用了 @Primary 注解標(biāo)注,所以 @Autowired 會優(yōu)先使用 name 為 bookService01 進(jìn)行裝配
測試 2
@Qualifier("bookService") @Autowired private BookService bookService; @Test public void MyTest() { System.out.println(bookService); }
雖然組件 2 使用了 @Primary 注解標(biāo)注,但是 @Qualifier 比 @Primary 的優(yōu)先級要高,所以使用注解 @Qualifier 標(biāo)注指定后, @Primary 就不起作用了,所以還是直接用指定的 bookService 作為組件的 name 去容器中裝配
到此這篇關(guān)于Spring中的@Autowired、@Qualifier和@Primary注解詳解的文章就介紹到這了,更多相關(guān)@Autowired、@Qualifier和@Primary注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
圖文教程教你IDEA中的Spring環(huán)境搭建+簡單入門
這篇文章主要介紹了圖文教程教你IDEA中的Spring環(huán)境搭建+簡單入門,Spring的環(huán)境搭建使用Maven更加方便,需要的朋友可以參考下2023-03-03Jenkin郵件收發(fā)實(shí)現(xiàn)原理及過程詳解
這篇文章主要介紹了Jenkin郵件收發(fā)實(shí)現(xiàn)原理及過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Springboot打包代碼,反編譯后代碼混淆方式(防止還原代碼)
文章主要介紹了如何對Spring Boot項(xiàng)目進(jìn)行jar包混淆,以防止反編譯還原原始代碼,通過在項(xiàng)目中添加proguard.cfg文件并配置Maven插件,可以實(shí)現(xiàn)代碼混淆,從而增加反編譯的難度2024-11-11mybatis的insert插入后獲取自增id的方法詳解(從controller到mapper)
這篇文章主要介紹了mybatis的insert插入后獲取自增id的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10java?Web實(shí)現(xiàn)用戶登錄功能圖文教程
這篇文章主要給大家介紹了關(guān)于java?Web實(shí)現(xiàn)用戶登錄功能的相關(guān)資料,在開發(fā)Web應(yīng)用程序中,用戶登錄是一個常見的功能,文中通過代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10SpringBoot自定義實(shí)現(xiàn)內(nèi)容協(xié)商的三種策略
內(nèi)容協(xié)商是HTTP協(xié)議中的一個重要概念,允許同一資源URL根據(jù)客戶端的偏好提供不同格式的表示,這篇文章主要介紹了SpringBoot自定義實(shí)現(xiàn)內(nèi)容協(xié)商的三種策略,希望對大家有一定的幫助2025-04-04