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.工厂方法注入(不多使用,不推荐)