關於spring autowrie的5種方式

spring自動注入有5中方式,分別是:java

  1. byName:根據自動注入類中的對象名字,會到配置文件中找相關id或者name的bean,若是找不到則不會匹配,若是找到多個bean,則會報錯。
  2. byType:根據自動注入類中的對象類型,找到配置文件中相同類型的bean,若是找到多個類型相同的bean,會報錯。若沒有找到相關匹配,則什麼都不會發生。
  3. constructor:根據構造函數的參數進行自動匹配。若是一個類中有多個構造方法,會優先找參數最多的構造方法。若是有構造方法參數同樣多,則會執行先找到那個(我的感受)。經過構造方法注入Dog類,具體寫法以下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
             "http://www.sprintframework.org/dtd/spring-beans.dtd">
    <beans>
        <bean id="EnHelloWorld" class="cn.action.EnHelloWorld">
            <constructor-arg index="0">
                <value>xwt!</value>
            </constructor-arg>
            <constructor-arg index="1">
                <value>cm!</value>
            </constructor-arg>
            <constructor-arg index="2">
                <ref bean="date"/>
            </constructor-arg>
        </bean>
        <!--id中不能夠包含特殊字符。一個bean中能夠沒有ID,此時能夠用name來代替id,
        能夠有多個name,中間用‘,’隔開。id和name能夠同時存在  -->
        
        <!--sigleton默認爲true。當true時,會共享一個實例,每次請求返回的都是同一個。就是單例模式
        若是爲false,每次請求都會返回一個新建立的實例  -->
        <bean id="ChHelloWorld"  class="cn.action.HelloWorld"  autowire="constructor" >
            <property name="msg">
                <value>xxxx</value>
            </property>
            <property name="date">
                <ref bean="date"/>
            </property>
        </bean>
        <bean id="date" class="java.util.Date"/>
        <bean name="dog" class="cn.model.Dog">
            <property name="name">
                <value>TT</value>
            </property>
        </bean>
    </beans>

     

  4. autodetect:經過對Bean檢查類的內部來選擇constructor或者byType。先找到哪個就執行哪個。使用autodetect時候在類中必須寫set方法,能夠不寫構造方法(不寫時總會有默認的無參構造)。若是沒有或者有多個構造方法時候,會優先執行set方法,若是隻有一個構造方法,會優先執行constructor方式(本身測試得出,可能有誤)。
  5. no:不使用自動裝配,bean的應用使用ref。許多企業級的應用中不推薦使用自動注入,由於自動注入會使得依賴關係不清晰。

總結:顯示的依賴例如property和constructor-arg元素總會覆蓋自動裝配,對於大型應用來講不推薦使用自動注入。由於它去除了參考依賴的透明性和清晰性。還有值得注意的一點就是byName和 byType兩種自動注入方式不能注入基本類型。spring

相關文章
相關標籤/搜索