Spring支持3種依賴注入的方式:屬性注入、構造器注入、工廠java
1.屬性注入less
屬性注入即經過setter方法注入Bean的屬性或依賴的對象。使用<property>元素,使用name屬性指定Bean的屬性名稱,value 屬性或<value>子節點指定屬性值函數
,是實際應用當中最經常使用的注入方式。spa
<!--配置Bean--> <bean id="helloWorld" class="com.wzy.lesson1.HelloWorld"> <!--經過setName方法注入--> <property name="name" value="Spring"/> </bean>
2.構造器注入code
經過構造方法注入Bean的屬性值或依賴的對象,它保證了Bean實例化後就能夠使用。對象
構造器注入在<constructor-arg>元素裏聲明屬性,<constructor-arg>中沒有name屬性。blog
1 <!--經過構造方法來配置bean的屬性--> 2 <bean id="car" class="com.wzy.lesson1.Car"> 3 <constructor-arg value="Audi" index="0"/> 4 <constructor-arg value="ShangHai" index="1"/> 5 <constructor-arg value="3000000" index="2"/> 6 </bean>
若是構造方法的參數個數相同,而且只指定了參數的順序沒有指定參數的類型,那麼容器將沒法區分應使用哪一個構造器,就會形成錯誤。class
1 <!--經過構造方法來配置bean的屬性--> 2 <bean id="car" class="com.wzy.lesson1.Car"> 3 <constructor-arg value="Audi" index="0"/> 4 <constructor-arg value="ShangHai" index="1"/> 5 <constructor-arg value="3000000" index="2"/> 6 </bean> 7 8 <!--經過構造方法來配置bean的屬性--> 9 <bean id="car1" class="com.wzy.lesson1.Car"> 10 <constructor-arg value="Audi" index="0"/> 11 <constructor-arg value="ShangHai" index="1"/> 12 <constructor-arg value="200" index="2" /> 13 </bean>
由於沒有指定類型因此容器都使用了,第一個構造方法進行注入,致使原本的maxSpeed屬性值注入到price當中容器
在注入時咱們指定注入的參數類型,來避免構造函數重載時,發生這種錯誤:配置
1 <!--經過構造方法來配置bean的屬性--> 2 <bean id="car" class="com.wzy.lesson1.Car"> 3 <constructor-arg value="Audi" index="0" type="java.lang.String"/> 4 <constructor-arg value="ShangHai" index="1" type="java.lang.String"/> 5 <constructor-arg value="3000000" index="2" type="double"/> 6 </bean> 7 8 <!--經過構造方法來配置bean的屬性--> 9 <bean id="car1" class="com.wzy.lesson1.Car"> 10 <constructor-arg value="Audi" index="0" type="java.lang.String"/> 11 <constructor-arg value="ShangHai" index="1" type="java.lang.String"/> 12 <constructor-arg value="200" index="2" type="int"/> 13 </bean>
這樣咱們就能夠獲得正確的結果:
3.工廠方法注入(不多使用,不推薦)