Spring框架的自動(dòng)裝配功能使您可以隱式注入對(duì)象依賴項(xiàng)。它在內(nèi)部使用setter或構(gòu)造函數(shù)注入。
自動(dòng)裝配不能用于注入基本值和字符串值。它僅適用于參考。
它需要 更少的代碼,因?yàn)槲覀儾恍枰帉懘a來顯式注入依賴項(xiàng)。
沒有程序員的控制權(quán)。
它不能用于原始值和字符串值。
有很多自動(dòng)裝配模式:
模式 | 說明 |
no | 這是默認(rèn)的自動(dòng)裝配模式。這意味著默認(rèn)情況下沒有自動(dòng)裝配。 |
byName | byName模式根據(jù)bean的名稱注入對(duì)象依賴項(xiàng)。在這種情況下,屬性名稱和bean名稱必須相同。它在內(nèi)部調(diào)用setter方法。 |
byType | byType模式根據(jù)類型注入對(duì)象依賴項(xiàng)。因此屬性名稱和bean名稱可以不同。它在內(nèi)部調(diào)用setter方法。 |
constructor | 構(gòu)造函數(shù)模式通過調(diào)用類的構(gòu)造函數(shù)來注入依賴項(xiàng)。它會(huì)調(diào)用具有大量參數(shù)的構(gòu)造函數(shù)。 |
autodetect | 從Spring 3開始不推薦使用。 |
讓我們看一下在Spring使用自動(dòng)裝配的簡單代碼。您需要使用bean元素的autowire屬性來應(yīng)用自動(dòng)裝配模式。
<bean id="a" class="org.sssit.A" autowire="byName"></bean>
讓我們看看Spring自動(dòng)布線的完整示例。為了創(chuàng)建此示例,我們創(chuàng)建了4個(gè)文件。
B.java A.java applicationContext.xml Test.java
B.java
此類僅包含構(gòu)造函數(shù)和方法。
package org.sssit; public class B { B(){System.out.println("b is created");} void print(){System.out.println("hello b");} }
A.java
此類包含B類的引用以及構(gòu)造函數(shù)和方法。
package org.sssit; public class A { B b; A(){System.out.println("a is created");} public B getB() { return b; } public void setB(B b) { this.b = b; } void print(){System.out.println("hello a");} void display(){ print(); b.print(); } }
applicationContext.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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean> </beans>
Test.java
此類從applicationContext.xml文件獲取Bean并調(diào)用顯示方法。
package org.sssit; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); A a=context.getBean("a",A.class); a.display(); } }
輸出:
b is created a is created hello a hello b
在byName自動(dòng)裝配模式下,bean id和引用名稱必須相同。
內(nèi)部使用setter注射。
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean>
但是,如果更改bean的名稱,它將不會(huì)注入依賴項(xiàng)。
讓我們看看將bean的名稱從b更改為b1的代碼。
<bean id="b1" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean>
在byType自動(dòng)裝配模式下,bean ID和引用名稱可能不同。但是只能有一個(gè)類型的bean。
內(nèi)部使用setter注入。
<bean id="b1" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byType"></bean>
在這種情況下,它可以正常工作,因?yàn)槟鷦?chuàng)建了B類型的實(shí)例。沒關(guān)系,您可以使用與引用名稱不同的Bean名稱。
但是,如果您具有一種類型的多個(gè)Bean,它將不起作用并拋出異常。
讓我們看看代碼中有很多B型bean。
<bean id="b1" class="org.sssit.B"></bean> <bean id="b2" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean>
在這種情況下,它將引發(fā)異常。
在構(gòu)造函數(shù)自動(dòng)裝配模式下,spring容器通過最高參數(shù)化的構(gòu)造函數(shù)注入依賴項(xiàng)。
如果一個(gè)類中的3個(gè)構(gòu)造函數(shù),零參數(shù),一個(gè)參數(shù)和兩個(gè)參數(shù),然后通過調(diào)用兩個(gè)參數(shù)構(gòu)造函數(shù)執(zhí)行注入。
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="constructor"></bean>
在沒有自動(dòng)裝配模式的情況下,spring容器不會(huì)通過自動(dòng)裝配注入依賴項(xiàng)。
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="no"></bean>