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

04 Spring框架 依賴註入(一)

ride sts 版權 div () 序號 哪些 成功 computer

上一節我們講了幾個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

以上就是兩種註入方法 。

版權聲明:本文為博主原創文章,如需轉載請表明出處。 https://blog.csdn.net/qq_39266910/article/details/77794393

04 Spring框架 依賴註入(一)