Spring Autowired(required = false) 說明
from:http://darkmasky.iteye.com/blog/1129828
- 當候選 Bean 數目不為 1 時的應對方法
- 在預設情況下使用 @Autowired 註釋進行自動注入時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,Spring 容器將丟擲 BeanCreationException 異常,並指出必須至少擁有一個匹配的 Bean。我們可以來做一個實驗:
- 清單 10. 候選 Bean 數目為 0 時
- <?xml version="1.0" encoding="UTF-8" ?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ">
- <bean class="org.springframework.beans.factory.annotation.
- AutowiredAnnotationBeanPostProcessor"/>
- <bean id="boss" class="com.baobaotao.Boss"/>
- <!-- 將 office Bean 註釋掉 -->
- <!-- <bean id="office" class="com.baobaotao.Office">
- <property name="officeNo" value="001"/>
- </bean>-->
- <bean id="car" class="com.baobaotao.Car" scope="singleton">
- <property name="brand" value=" 紅旗 CA72"/>
- <property name="price" value="2000"/>
- </bean>
- </beans>
- 由於 office Bean 被註釋掉了,所以 Spring 容器中將沒有型別為 Office 的 Bean 了,而 Boss 的 office 屬性標註了 @Autowired,當啟動 Spring 容器時,異常就產生了。
- 當不能確定 Spring 容器中一定擁有某個類的 Bean 時,可以在需要自動注入該類 Bean 的地方可以使用 @Autowired(required = false),這等於告訴 Spring:在找不到匹配 Bean 時也不報錯。來看一下具體的例子:
- 清單 11. 使用 @Autowired(required = false)
- package com.baobaotao;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Required;
- public class Boss {
- private Car car;
- private Office office;
- @Autowired
- public void setCar(Car car) {
- this.car = car;
- }
- @Autowired(required = false)
- public void setOffice(Office office) {
- this.office = office;
- }
- …
- }
- 當然,一般情況下,使用 @Autowired 的地方都是需要注入 Bean 的,使用了自動注入而又允許不注入的情況一般僅會在開發期或測試期碰到(如為了快速啟動 Spring 容器,僅引入一些模組的 Spring 配置檔案),所以 @Autowired(required = false) 會很少用到。
- 和找不到一個型別匹配 Bean 相反的一個錯誤是:如果 Spring 容器中擁有多個候選 Bean,Spring 容器在啟動時也會丟擲 BeanCreationException 異常。來看下面的例子:
- 清單 12. 在 beans.xml 中配置兩個 Office 型別的 Bean
- …
- <bean id="office" class="com.baobaotao.Office">
- <property name="officeNo" value="001"/>
- </bean>
- <bean id="office2" class="com.baobaotao.Office">
- <property name="officeNo" value="001"/>
- </bean>
- …
- 我們在 Spring 容器中配置了兩個型別為 Office 型別的 Bean,當對 Boss 的 office 成員變數進行自動注入時,Spring 容器將無法確定到底要用哪一個 Bean,因此異常發生了。
- Spring 允許我們通過 @Qualifier 註釋指定注入 Bean 的名稱,這樣歧義就消除了,可以通過下面的方法解決異常:
- 清單 13. 使用 @Qualifier 註釋指定注入 Bean 的名稱
- @Autowired
- public void setOffice(@Qualifier("office")Office office) {
- this.office = office;
- }
- @Qualifier("office") 中的 office 是 Bean 的名稱,所以 @Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。@Autowired 可以對成員變數、方法以及建構函式進行註釋,而 @Qualifier 的標註物件是成員變數、方法入參、建構函式入參。正是由於註釋物件的不同,所以 Spring 不將 @Autowired 和 @Qualifier 統一成一個註釋類。下面是對成員變數和建構函式入參進行註釋的程式碼:
- 對成員變數進行註釋:
- 清單 14. 對成員變數使用 @Qualifier 註釋
- public class Boss {
- @Autowired
- private Car car;
- @Autowired
- @Qualifier("office")
- private Office office;
- …
- }
- 對建構函式入參進行註釋:
- 清單 15. 對建構函式變數使用 @Qualifier 註釋
- public class Boss {
- private Car car;
- private Office office;
- @Autowired
- public Boss(Car car , @Qualifier("office")Office office){
- this.car = car;
- this.office = office ;
- }
- }
- @Qualifier 只能和 @Autowired 結合使用,是對 @Autowired 有益的補充。一般來講,@Qualifier 對方法簽名中入參進行註釋會降低程式碼的可讀性,而對成員變數註釋則相對好一些。
相關文章
- @Autowired 注入 **required a single bean, but 2 were found**UIBean
- Spring配置說明Spring
- Spring之autowiredSpring
- Spring Boot 2.7.0 更新說明Spring Boot
- spring中的IOC說明Spring
- Spring @Autowired 注入小技巧Spring
- Spring配置項解釋說明Spring
- spring aop expression簡單說明SpringExpress
- Spring Boot 注入介面 @Autowired interfaceSpring Boot
- Spring原始碼系列:註解說明Spring原始碼
- Spring的@Qualifier註解使用說明Spring
- Spring BcryptPasswordEncorder Log Rounds引數說明Spring
- Spring探索:既生Resource,何生Autowired?Spring
- 備忘錄一:Spring Boot HikariCP 配置說明Spring Boot
- Spring框架裡註解@Autowired的工作原理Spring框架
- true || false && falseFalse
- JS的隱式轉換 從 [] ==false 說起JSFalse
- SYSAUX 說明UX
- 使用說明
- Hack 說明
- Spring@Autowired註解與自動裝配Spring
- spring5.x版本 java配置和annotation配置說明SpringJava
- 專利說明書及其說明書附圖
- 用Excel做資料說明――抽樣說明工具Excel
- openssh版本更新與說明 openssl版本更新與說明
- WebApiClientCore使用說明WebAPIclient
- QLExpress使用說明Express
- postman 使用說明Postman
- SDWebImage中文說明Web
- objc物件說明OBJ物件
- MOBIM介面說明
- git 操作說明Git
- Oracle Latch 說明Oracle
- Oracle Namespace 說明Oraclenamespace
- 埠號說明
- Kafka配置說明Kafka
- zookeeper埠說明
- Oracle 版本說明Oracle