一、Spring IOC 容器支持自動裝配 Bean,所謂自動裝配是指,不需要通過 <property> 或 <constructor-arg> 為 Bean 的屬性註入值的過程。 二、配置: 在 <bean> 的 autowire 屬性里指定自動裝配的模式。預設為 no 。可以通過 <beans> ...
一、Spring IOC 容器支持自動裝配 Bean,所謂自動裝配是指,不需要通過 <property> 或 <constructor-arg> 為 Bean 的屬性註入值的過程。
二、配置:
在 <bean> 的 autowire 屬性里指定自動裝配的模式。預設為 no 。可以通過 <beans> 根元素的 default-autowire 屬性改變預設值。
三、自動裝配的三種模式:
1.byType(根據類型自動裝配):若 IOC 容器中出現多個與目標 Bean 類型一致的 Bean。Spring 無法識別使用哪個,有二義性。報異常。
2.byName(根據名稱的自動裝配):必須將當前 Bean 的屬性名和目標 Bean 的 id 值設置為相同。
3.construtor(根據構造器自動裝配):不推薦使用。
四、例子
e1:之前的方式,通過 <property> 來指定。
<bean class="com.nucsoft.spring.Address" id="address"> <property name="addressName" value="beijing"/> </bean> <bean class="com.nucsoft.spring.Phone" id="phone" p:phoneNum="123456789"/> <bean id="employee" class="com.nucsoft.spring.Employee"> <property name="empName" value="emp01"/> <property name="phone" ref="phone"/> <property name="address" ref="address"/> </bean>
輸出:Employee{empName='emp01', address=Address{addressName='beijing'}, phone=Phone{phoneNum='123456789'}}
e2:根據名稱的自動裝配
<bean class="com.nucsoft.spring.Address" id="address"> <property name="addressName" value="beijing"/> </bean> <bean class="com.nucsoft.spring.Phone" id="phone" p:phoneNum="123456789"/> <bean id="employee" class="com.nucsoft.spring.Employee" autowire="byName"> <property name="empName" value="emp01"/> </bean>
輸出:Employee{empName='emp01', address=Address{addressName='beijing'}, phone=Phone{phoneNum='123456789'}}
e3:根據類型的自動裝配
<bean class="com.nucsoft.spring.Address" id="address"> <property name="addressName" value="beijing"/> </bean> <bean class="com.nucsoft.spring.Phone" id="phone" p:phoneNum="123456789"/> <bean id="employee" class="com.nucsoft.spring.Employee" autowire="byType"> <property name="empName" value="emp01"/> </bean>
輸出:Employee{empName='emp01', address=Address{addressName='beijing'}, phone=Phone{phoneNum='123456789'}}
如果定義多個的話,首先在 idea 中,spring config 文件會報錯,給出提示。另外,如果運行的話,會報一個 org.springframework.beans.factory.NoUniqueBeanDefinitionException 這樣的異常。
五、細節問題
1.對 <bean> 的屬性設置 autowire 屬性進行自動裝配將會裝配 Bean 的所有屬性。若希望只裝配某個屬性時,autowire 屬性就不夠靈活了。
2.雖然可以通過 autowire 屬性能自動裝配,但是優先順序要低於通過 <property> 配置的屬性。如:
<bean class="com.nucsoft.spring.Phone" id="phone02" p:phoneNum="1234567890"/> <bean class="com.nucsoft.spring.Address" id="address"> <property name="addressName" value="beijing"/> </bean> <bean class="com.nucsoft.spring.Phone" id="phone" p:phoneNum="123456789"/> <bean id="employee" class="com.nucsoft.spring.Employee" autowire="byName"> <property name="empName" value="emp01"/> <property name="phone" ref="phone02"/> </bean>
3.對於 autowire 屬性的兩種類型:根據類型或根據名稱的自動裝配不能同時使用。
4.在實際項目中很少使用基於 XML 的 Bean 的自動裝配,因為明確清晰配置更易讀。