•Spring 支持 3 种依赖注入的方式
–属性注入
•属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象
•属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值
•属性注入是实际应用中最常用的注入方式
<bean id="helloWorld" class="com.spring.HelloWorld">
<property name="userName" value="Spring"></property>
</bean>
–构造器注入
通过代码详解
构造一个Car类
public class Car {
private String brand;
private String corp;
private int price;
private int maxSpeed;
public Car(String brand, String corp, int price) {
this.brand = brand;
this.corp = corp;
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", corp='" + corp + '\'' +
", price=" + price +
", maxSpeed=" + maxSpeed +
'}';
}
}
在applicarion.xml中给每个属性赋值
<!--通过构造方法配置bean的属性-->
<bean id="car" class="com.spring.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="ShangHai" index="1"></constructor-arg>
<constructor-arg value="300000" index="2"></constructor-arg>
</bean>
通过index的序号依次给每个属性赋值
查看运行结果
Car car = (Car) ctx.getBean("car");
System.out.println(car);
Car{brand='Audi', corp='ShangHai', price=300000.0, maxSpeed=0}
我们现在再创建一个构造器代码如下
public class Car {
private String brand;
private String corp;
private double price;
private int maxSpeed;
public Car(String brand, String corp, double price) {
this.brand = brand;
this.corp = corp;
this.price = price;
}
public Car(String brand, String corp, int maxSpeed) {
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", corp='" + corp + '\'' +
", price=" + price +
", maxSpeed=" + maxSpeed +
'}';
}
这两个构造器属性不同,属性类型不同
我们再通过配置文件给第二个构造器赋值
<bean id="car2" class="com.spring.Car">
<constructor-arg value="Baoma"></constructor-arg>
<constructor-arg value="Tianjin"></constructor-arg>
<constructor-arg value="200"></constructor-arg>
</bean>
按照我们的设想程序运行的结果应该是brand为Baoma,corp为Tianjin,maxSpeed为200
我们实际看看运行结果
car = (Car)ctx.getBean("car2");
Car{brand='Baoma', corp='Tianjin', price=200.0, maxSpeed=0}
实际我们看到运行结果并没有达到我们的预期,这时应为配置文件给属性赋值时,由于出现两个构造器,所以它无法判断应该给那个构造器赋值,这种情况下,我们也无法通过Index标识每个属性,此时我们可以通过按照类型匹配的方式
修改代码如下
<bean id="car" class="com.spring.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="ShangHai" index="1"></constructor-arg>
<constructor-arg value="300000" index="2" type="double"></constructor-arg>
</bean>
<bean id="car2" class="com.spring.Car">
<constructor-arg value="Baoma" type="java.lang.String"></constructor-arg>
<constructor-arg value="Tianjin" type="java.lang.String"></constructor-arg>
<constructor-arg value="200" type="int"></constructor-arg>
</bean>
此时我们再看看运行结果
Car{brand='Audi', corp='ShangHai', price=300000.0, maxSpeed=0}
Car{brand='Baoma', corp='Tianjin', price=0.0, maxSpeed=200}
达到了我们的预期
在这个过程中,我们使用构造器注入属性值可以指定参数的位置和参数的类型,以区分重载的构造器
•字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入。
•基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式
•若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。
如:
<constructor-arg index="1">
<value><![CDATA[ShangHai]]></value>
</constructor-arg>
–工厂方法注入(很少使用,不推荐)
注:该文章其内容主要来源于学习尚硅谷视频中的内容,为了方便以后学习,所以写成了该文章