基於XML配置Spring的自動裝配過程解析
阿新 • • 發佈:2020-01-07
一、瞭解Spring自動裝配的方式
採用傳統的XML方式配置Bean元件的關鍵程式碼如下所示
<bean id="userMapper" class="edu.cn.dao.UserMapperImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> <bean id="userService" class="edu.cn.dao.UserServiceImpl"> <property name="userMapper" ref="userMapper"/> </bean>
我們通過<property>標籤為Bean的屬性注入所需的值,當需要維護的Bean元件及需要注入的屬性更多時,勢必會增加配置的工作量。這時可以使用自動裝配。
二、為每個Bean元件指定自動裝配的方式
使用自動裝配修改配置程式碼如下
<bean id="userMapper" class="edu.cn.dao.UserMapperImpl" autowire="byName"/> <bean id="userService" class="edu.cn.dao.UserServiceImpl" autowire="byName"/>
通過設定<bean>元素的autowire屬性指定自動裝配,代替了通過<property>標籤顯示指定Bean的依賴關係。由BeanFactory檢查XML配置檔案的內容,為Bean自動注入依賴關係。
Spring提供了多種自動裝配方式,autowire屬性常用的取值如下所示
- no 不使用自動裝配。Bean依賴關係必須通過property元素定義
- byType 根據屬性型別自動裝配。BeanFactory查詢容器中的全部Bean,如果正好有一個與依賴屬性型別相同的Bean,就自動裝配這個屬性;如果有多個這樣的Bean,Spring無法決定注入哪個Bean,就丟擲一個致命異常;如果沒有匹配的Bean,就什麼都不會發生,屬性不會被設定
- byName 根據屬性名自動裝配。BeanFactory查詢容器中的全部Bean,找出id與屬性的setter方法入參匹配的Bean。找到即自動注入,否則什麼都不做
- constructor 與byType的方式類似,不同之處在於它應用於構造器引數。如果在容器中沒有找到與構造器引數型別一致的Bean,那麼將會丟擲異常
在Spring配置檔案中通過<bean>元素的autowire屬性可以實現自動裝配。但是,如果要配置的Bean很多,每個Bean都配置autowire屬性也會很繁瑣,可不可以統一設定自動注入而不必分別配置每個Bean呢?
三、設定全域性自動裝配
<beans>元素提供了default-autowire屬性。可以使用上面列出的屬性值為<beeas>設定default-autowire屬性以影響全域性。
<?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" default-autowire="byName"> </beans>
在<beans>節點上設定default-autowired時,依然可以為<bean>節點設定autowire屬性。這時該<bean>節點上的自動裝配設定將覆蓋全域性設定,成為該Bean的自動裝配策略。
對於大型的應用,不鼓勵使用自動裝配。雖然使用自動裝配可以減少配置工作量,但也大大降低了依賴關係的清晰性和透明性。依賴關係的裝配僅依賴於原始檔的屬性名或型別,導致Bean和Bean之間的耦合降低到程式碼層次,不利於高層次解耦合。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。