1. 程式人生 > >依賴注入的方式

依賴注入的方式

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>

工廠方法注入(很少使用,不推薦)

注:該文章其內容主要來源於學習尚矽谷視訊中的內容,為了方便以後學習,所以寫成了該文章