Spring中的自動裝配機制詳解
一、什么是自動裝配?
自動裝配就是會通過Spring的上下文為你找出相應依賴項的類,通俗的說就是Spring會在上下文中自動查找,并自動給Bean裝配與其相關的屬性!
spring中實現(xiàn)自動裝配的方式有兩種,一種是通過xml文件、一種是通過注解的方式。
下面為大家介紹這兩種方式實現(xiàn)自動裝配。
為了更簡單的讓大家理解,我們通過例子來說明: 有以下三個實體類,People類,Dog類,Cat類,分別代表人、狗、貓。
人養(yǎng)了一只狗和一只貓,貓和狗都會叫。
public class Cat {
public void shout(){
System.out.println("miao~");
}
}public class Dog {
public void shout(){
System.out.println("wang wang~");
}
}public class Peopel {
private Cat cat;
private Dog dog;
private String name;
Setter/Getter...二、手動裝配
講自動裝配之前,我們先來說一下手動裝配,手動裝配又是什么?
手動裝配就是通過xml配置自己將bean中所關聯(lián)的其他bean裝配進去。
用代碼表示:
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="people" class="com.kuang.pojo.Peopel">
<property name="name" value="張三"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean></beans>在id=people的bean(以后id=xx的bean我們就叫xxBean)中,我們給peopleBean手動裝配了與之關聯(lián)的catBean和dogBean,這就叫做手動裝配。
那么有沒有什么辦法,我們可以不用去手動裝配關聯(lián)的bean,讓spring幫我們自動把關聯(lián)的bean裝配進去呢?答案是肯定的。
自動裝配就可以幫助我們解決這個問題。
實現(xiàn)自動裝配有兩種方式。一種是使用注解的方式、另一種是通過xml文件的方式。
下面我們倆講實現(xiàn)自動裝配的兩種方式。
三、自動裝配
3.1 通過xml文件實現(xiàn)自動裝配
我們只需要在xml配置文件中的bean標簽中加入一個屬性autowire即可,例如:
<bean id="people" class="com.kuang.pojo.Peopel" autowire="byName">
<property name="name" value="張三"/>
</bean>使用autowire關鍵字聲明bean的自動裝配方式。
其可選值為byName、byType、constructor,default,no;
這里講前邊兩個。
3.1.1 byName
設置autowire屬性為byName,那么Spring會根據(jù)class屬性找到實體類,然后查詢實體類中所有setter方法的名字,根據(jù)setter方法后面的名字(例如SetDog,則setter方法后面的名字為dog)再到配置文件中尋找一個與該名字相同id的Bean,注入進來。如圖:

3.1.2 byType
設置autowire屬性為byType,那么Spring會自動尋找一個與該屬性類型相同的Bean,注入進來。

*注意:使用byType這種方式,必須保證配置文件中所有bean的class屬性的值是唯一的,否則就會報錯
例如:下邊這種方式是錯誤的,因為兩個bean中的class屬性的值重復了,會報錯

3.2 通過注解實現(xiàn)自動裝配
注解是通過反射來實現(xiàn)的。
3.2.1 使用注解前的準備:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>注意: conteext:annotation-config/ 必須要寫在xml中,這是用來開啟注解的支持,如果不加上注解就無效。
3.2.2 使用
首先xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="people" class="com.kuang.pojo.Peopel">
<property name="name" value="張三"/>
</bean>
</beans>然后在實體類的對應屬性上添加@Autowired注解(也可以把注解放到對應屬性的setter上),people類中依賴Dog類和Cat類。
所以在people類中的dog和cat屬性上要加上@Autowired,實現(xiàn)自動裝配。
public class Peopel {
@Autowired
private Cat cat;
@Autowired
private Dog dog;
private String name;
setter/getter...
}3.3 重點
(1)注解方法裝配屬性的過程:spring會默認優(yōu)先根據(jù)(被注解修飾的)屬性類型去容器中找對應的組件(bean),找到就賦值;若找到多個相同類型的組件,再將屬性的名稱作為組件(bean)的id去容器中查找。
(2)@Qualifier注解可以和使用Autowired搭配使用:@Qualifier指定需要裝配的組件的id,而不是使用屬性名。
例如下邊例子,spring就會優(yōu)先在容器中查找id為“cat”的組件。
public class Peopel {
@Autowired
@Qualifier(value = "cat")
private Cat cat;
}什么情況會使用到@Qualifier注解:當ioc容器根據(jù)屬性類型去容器中找找到多個相同類型的組件,再將屬性的名稱作為組件(bean)的id去容器中查找找不到時就是用這兩個注解搭配,指定需要裝配的bean的id。
(3)在默認情況下使用 @Autowired 注釋進行自動注入時,Spring 容器中匹配的候選 Bean 數(shù)目必須有且僅有一個。當找不到一個匹配的 Bean 時,Spring 容器將拋出 BeanCreationException 異常,并指出必須至少擁有一個匹配的 Bean。當不能確定 Spring 容器中一定擁有某個類的 Bean 時,可以在需要自動注入該類 Bean 的地方可以使用@Autowired(required= false)。這等于告訴 Spring:在找不到匹配 Bean 時也不報錯。
3.3.1 Resource注解【不常用】
@Resource:可以和@Autowired一樣實現(xiàn)自動裝配功能
但是跟@Autowired不一樣的是,它默認是按照組件名稱進行裝配的,按照組件名稱找不到在根據(jù)屬性類型去查找再找不到就報錯;
他們另一個不同的地方就是@Autowired是Spring定義的;
@Resource是java規(guī)范。
到此這篇關于Spring中的自動裝配機制詳解的文章就介紹到這了,更多相關Spring自動裝配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot常用請求方式及請求參數(shù)傳遞的方式
本文給大家介紹SpringBoot常用請求方式及請求參數(shù)傳遞的方式,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2025-08-08
java數(shù)據(jù)結(jié)構(gòu)之插入排序
這篇文章主要為大家詳細介紹了java數(shù)據(jù)結(jié)構(gòu)之插入排序的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
spring security動態(tài)配置url權(quán)限的2種實現(xiàn)方法
對于使用spring security來說,存在一種需求,就是動態(tài)去配置url的權(quán)限,即在運行時去配置url對應的訪問角色。下面這篇文章主要給大家介紹了關于spring security動態(tài)配置url權(quán)限的2種實現(xiàn)方法,需要的朋友可以參考下2018-06-06
實例解析Json反序列化之ObjectMapper(自定義實現(xiàn)反序列化方法)
這篇文章主要介紹了實例解析Json反序列化之ObjectMapper,json自定義序列化的方法,需要的朋友可以了解下。2017-09-09
SpringBoot項目中HTTP請求體只能讀一次的解決方案
在基于Spring開發(fā)Java項目時,可能需要重復讀取HTTP請求體中的數(shù)據(jù),例如使用攔截器打印入?yún)⑿畔⒌?但當我們重復調(diào)用getInputStream()或者getReader()時,通常會遇到SpringBoot HTTP請求只讀一次的問題,本文給出了幾種解決方案,需要的朋友可以參考下2024-08-08
spring-boot中使用spring-boot-devtools的實現(xiàn)代碼
這篇文章主要介紹了spring-boot中使用spring-boot-devtools的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
Java異常處理UncaughtExceptionHandler使用實例代碼詳解
當一個線程由于未捕獲異常即將終止時,Java虛擬機將使用thread . getuncaughtexceptionhandler()查詢線程的uncaughtException處理程序,并調(diào)用處理程序的uncaughtException方法,將線程和異常作為參數(shù)傳遞2023-03-03
基于Java實現(xiàn)的圖的廣度優(yōu)先遍歷算法
這篇文章主要介紹了基于Java實現(xiàn)的圖的廣度優(yōu)先遍歷算法,需要的朋友可以參考下2014-07-07

