Spring中的依赖注入方式:属性注入、构造函数注入和工厂方式注入。
属性注入即通过setXxx()方法注入Bean的属性值或依赖对象。
属性注入要求Bean提供一个默认的构造函数,在Java中,如果没有定义任何构造函数,则JVM会自动为其生成一个默认的构造函数。反之,如果类中显示定义了构造函数,则JVM不会为其生成默认的构造函数,如public BeanCar(String carName){},则需要同时提供一个默认的public BeanCar(){},否则使用属性注入时将会抛出异常。
<bean id="car" class="com.mrge.cp3.Car"> <property name="maxSpeed"><value>345</value></property> <property name="color"><value>黑色</value></property> <property name="brand"><value>红旗CA72</value></property> </bean>
这里属性的配置,要求bean中必须要有setter方法,而不一定需要属性变量。
JavaBean关于属性名的特殊规范:
Spring配置文件中,JavaBean允许以大小写字母开头,但必须是前两个字符必须同时为大或同时为小,如ic、IC、ICcard、IDCard、ICCard都是合法的,iC、Iccard、iCCard、iDCard就是非法的。
使用构造函数注入的前提是Bean必须提供带参的构造函数。
public Car(String brand,int maxSpeed) { this.brand=brand; this.maxSpeed=maxSpeed; }
<bean id="car1" class="com.mrge.cp3.Car"> <constructor-arg type="java.lang.String"> <value>红旗CA72</value> </constructor-arg> <constructor-arg type="int"> <value>560</value> </constructor-arg> </bean>
public Car(String brand,String color,int maxSpeed) { this.brand=brand; this.color=color; this.maxSpeed=maxSpeed; }
<bean id="car2" class="com.mrge.cp3.Car"> <constructor-arg index="0" value="红旗CA72"/> <constructor-arg index="1" value="白色"/> <constructor-arg index="2" value="201"/> </bean>
这里索引是从0开始。
<bean id="car3" class="com.mrge.cp3.Car"> <constructor-arg index="1" type="java.lang.String"> <value>红旗CA72</value></constructor-arg> <constructor-arg index="2" type="java.lang.String"> <value>白色</value></constructor-arg> <constructor-arg index="3" type="java.lang.String"> <value>201</value></constructor-arg> </bean>
public Boss(String name,Car car,Office office) { this.name=name; this.car=car; this.office=office; }
<bean id="boss" class="com.mrge.cp3.Boss"> <constructor-arg><value>Tom</value></constructor-arg> <constructor-arg><ref bean="car"/></constructor-arg> <constructor-arg><ref bean="office"/></constructor-arg> </bean>
<bean id="car" class="com.mrge.cp3.Car">
<bean id="office" class="com.mrge.cp3.Office">