依赖注入的方式

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>

工厂方法注入(很少使用,不推荐)

注:该文章其内容主要来源于学习尚硅谷视频中的内容,为了方便以后学习,所以写成了该文章

猜你喜欢

转载自blog.csdn.net/QuZDLvT/article/details/81411233