Spring中的@Autowired、@Qualifier和@Primary注解詳解
1. @Autowired 注解
1.1. @Autowired 注解的使用
@Autowired 注解,可以對類成員變量、方法和構(gòu)造函數(shù)進行標注,完成自動裝配的工作
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 注解的說明
- 默認優(yōu)先按照 byType 去容器中找對應(yīng)的組件,找到就賦值
- 如果找到多個相同類型的組件,再通過 byName 來到 IOC 容器中進行查找
- 默認情況下,它具有強制契約特性,其所標注的屬性必須是可裝配的。如果沒有 bean 可以裝配到 @Autowired 所標注的屬性或參數(shù)中,那么你會看到 org.springframework.beans.factory.NoSuchBeanDefinitionException 的異常信息
2. @Autowired 配合 @Qualifier
- @Autowired 是默認根據(jù) byType 進行自動裝配的,如果需要按 byName 進行裝配,則需要配合 @Qualifier 注解使用
- 如果容器中存在多個相同類型的組件,此時需要通過 byName 來進行裝配,則需要配合 @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 在進行自動裝配的時候,會 優(yōu)先 使用用 @Primary 標注指定的 bean
- 如果容器中有多個組件 Type 類型相同,注入的 bean 的 Name 名稱也相同,那么此時就可以使用 @Primary 注解,將某一個組件 優(yōu)先 注入
- 不能把多個 bean 都標注為 @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);
}
因為組件 2 使用了 @Primary 注解標注,所以 @Autowired 會優(yōu)先使用 name 為 bookService01 進行裝配
測試 2
@Qualifier("bookService")
@Autowired
private BookService bookService;
@Test
public void MyTest() {
System.out.println(bookService);
}
雖然組件 2 使用了 @Primary 注解標注,但是 @Qualifier 比 @Primary 的優(yōu)先級要高,所以使用注解 @Qualifier 標注指定后, @Primary 就不起作用了,所以還是直接用指定的 bookService 作為組件的 name 去容器中裝配
到此這篇關(guān)于Spring中的@Autowired、@Qualifier和@Primary注解詳解的文章就介紹到這了,更多相關(guān)@Autowired、@Qualifier和@Primary注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker容器使用宿主機上的mongod/redis等服務(wù)詳解
這篇文章主要介紹了Docker容器使用宿主機上的mongod/redis等服務(wù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
swagger3.0實現(xiàn)https接口請求全過程
文章描述了在開發(fā)過程中遇到Swagger攔截器配置錯誤的問題,并通過自定義Swagger攔截器解決了該問題,最后重啟項目以應(yīng)用更改2026-01-01
SpringBoot yml配置敏感信息加密的實現(xiàn)
本文主要介紹了SpringBoot yml配置敏感信息加密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-08-08

