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

