1. 程式人生 > >04 Spring框架 依賴注入(一)

04 Spring框架 依賴注入(一)

整理了一下之前學習spring框架時候的一點筆記。如有錯誤歡迎指正,不喜勿噴。
上一節我們講了幾個bean的一些屬性,用來限制我們例項建立過後的狀態。
但是細心的我們會發現其實上面demo建立的例項並不完整,物件創建出來過後只有一個方法,而沒有包含其他資訊(如屬性)。
之前我們說了Spring的核心是IOC,這是使用Spring其他元件的前提條件。這裡我們做一下補充:Spring依賴IOC,而IOC依賴注入。
什麼是注入?
注入就是在Spring主配置檔案bean中新增一些資訊使得新建立的實體類能夠帶有屬性值(這裡的屬性值可以是其他例項的物件)。
接下來就該看看注入有哪些方法了。注入一共有三種:
①setter注入
②構造器注入
③介面注入
第一種使用的比較頻繁,其他兩種尤其是第三種幾乎不會使用。所以我們只講前兩種。
首先來講setter注入:
在主配置檔案中即applicationContext.xml中:

<!--set注入  -->

</bean>
<bean id="c2" class="com.Spring.Demo.Computer">
<property name="cpu" value="高通驍龍"></property>
<property name="hdd" value="希捷"></property>
<property name="mainbord" value="華碩"></property>
</bean >

這個就是bean的內容了,相比之前有了一點變化多了三項propertiy,裡邊包含name值和value值。這個是applicationContext.xml中的變化。
接下來實體類也同樣需要變化一下:

實體類Computer:

package com.Spring.Demo;
//set注入
public class Computer {
    private String cpu;
    private String hdd;
    private String mainbord;
    public void execute(){
        System.out.println("cpu:"+cpu);
        System.out.println("hdd:"+hdd);
        System.out.println("mainbord:"+mainbord);

    }
    public
String getCpu() { return cpu; } public void setCpu(String cpu) { this.cpu = cpu; } public String getHdd() { return hdd; } public void setHdd(String hdd) { this.hdd = hdd; } public String getMainbord() { return mainbord; } public void setMainbord(String mainbord) { this.mainbord = mainbord; } }

對,這個實體類相比之前多了三個屬性,同時增加了setter和getter方法和系統輸出方法(系統輸出方法是用來測試顯示例項是否成功用的),其中setter方法是必須的,getter方法只是順帶添加了,以防備後邊會用到。
接下來我們測試一下:

package com.Spring.Demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//set注入
public class TestComputer {
    public static void main(String[] args){
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        Computer c2=(Computer)ac.getBean("c2");
        c2.execute();
    }

}

控制檯輸出:

cpu:高通驍龍
hdd:希捷
mainbord:華碩

這樣我們就把computer的資訊注入進來了(是不是很神奇?)。

但是我們注入的要是一個引用型別的值怎麼辦?
例如一本書,它有一個書名,書號,出版社,但是出版社是一個引用型別(包含出版社名,出版社地址)。這樣的情況我們怎麼辦呢?
看下面的示例:

    <bean id = "book" class = "com.testSpring.Book">
        <property name = "bname" value = "Java技術"></property>
        <property name = "bnumber" value ="201410185732" ></property><!--通過使用ref來注入引用型別-->
        <property name = "bpub" ref = "publisher"></property>
    </bean>

    <bean id = "publisher" class="com.testSpring.publisher">
        <property name="name" value="清華大學出版社"></property>
        <property name="address" value="xxxx"></property>
    </bean>
package com.testSpring;

public class Book {
    private String bname;
    private String bnumber;
    private publisher bpub;

    public void setBname(String bname) {
        this.bname = bname;
    }
    public void setBnumber(String bnumber) {
        this.bnumber = bnumber;
    }
    public void setBpub(publisher bpub) {
        this.bpub = bpub;
    }
    @Override
    public String toString() {
        return "Book [bname=" + bname + ", bnumber=" + bnumber + ", bpub=" + bpub + "]";
    }
}
package com.testSpring;

public class publisher {
    String name;
    String address;
    public void setName(String name) {
        this.name = name;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "publisher [name=" + name + ", address=" + address + "]";
    }
}
//測試(JUnit)
public class test {
    @Test
    public void Test01() {
        String resource = "com/testSpring/applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
        Book book = (Book)ac.getBean("book");
        System.out.println(book);
    }
}

控制檯輸出:

Book [bname=Java技術, bnumber=201410185732, bpub=publisher [name=清華大學出版社, address=xxxx]]

以上就是我們通過使用ref來注入引用型別

下面我們接著看構造器注入:
同理,先上主配置檔案程式碼:

<!--構造器注入  -->
<bean id="c3" class="com.Spring.Demo.phone">
<constructor-arg index="0" value="高通驍龍"></constructor-arg>
<constructor-arg index="1" value="2G"></constructor-arg>
</bean>

這裡的index是序號(記住是從0開始)。value為值。
當然我們這裡的index也可以直接使用name指定,同時也可以省略,但是順序上要和我們的類構造器要一致(不推薦,可讀性差)

接下來是實體類程式碼:

package com.Spring.Demo;

public class phone {
    private String cpu;
    private String ram;
    public phone(String cpu,String ram){
        this.cpu=cpu;
        this.ram=ram;   
    }
    public void show(){
        System.out.println("cpu:"+cpu);
        System.out.println("ram:"+ram);

    }
}

從中我們可以看出這個實體類多了一個構造器對新建例項進行初始化。
接下來進行測試:

package com.Spring.Demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestPhone {
    public static void main(String[] args){
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        phone c3=(phone)ac.getBean("c3");
        c3.show();


    }

}

控制檯輸出:

cpu:高通驍龍
ram:2G

以上就是兩種注入方法 (未完待續)