基於XML配置Spring的自動裝配


一、了解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之間的耦合降低到代碼層次,不利於高層次解耦合。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM