1. 程式人生 > >在Spring中依賴注入的幾種方式實現鬆耦合

在Spring中依賴注入的幾種方式實現鬆耦合

一、普通注入方式:

(1)在IDEA工作空間內先建立lib包然後匯入Spring的架包(複製進去的架包要按住滑鼠右鍵出現Add as Library)。

(2)在已經建立好架包的基礎上在src目錄下建立XML檔案,檔案命為applicationContext.xml,需要注意的是我們建立的是Spring Config的xml格式,假如說你匯入的架包沒有Add as Library的話是不會出現Spring Config的選項的。

(3)建立好xml檔案後在檔案中編寫:

<bean class="com.lgq.Spring01.User" id="user1
"/>

(注意:在裡面寫的是User我們先前設定好的JavaBean,並給出一個ID或者name【ID和nam的區別:ID的分號內表示bean只有一個名字,name裡面有多個bean的名字,他們使用逗號分開】);

(4)建立好我們的xml檔案後在src目錄下建立我們的檔案包(cn.sxt.Spring01);然後建立Class檔案命為User;建立我們的JAVABEAN,並建立set/get以及無參構造方法。在無參構造方法中輸出一句表示該Bean注入了Spring容器中。

    public class User {
    private Integer id;
    private String name;
    private String address;
    public void sayHello

(String name) {
        System.out.println("name->"+ name);
    }

(5)建立在Src目錄下建立一個Class命名為Main。在Main下建立ClassPathXmlAppliccationContext類,並把建立好的xml檔案路徑給到它。

    public class Main {

    public static void main(String[] args) {
        //初始化Spring容器,當Spring容器初始化時,會自動載入配置檔案,然後根據配置檔案中的內容初始化Bean
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext

("applicationContext.xml");
        //去Spring容器中,獲取一個物件
        User user1 = (User) ctx.getBean("user1");
        user1.sayHello("張三");
    }

二、靜態工廠注入方式

(1)靜態工廠模式實現的方式,先定義一個靜態工廠的方法;

public class UserFactory {

public static User getInstance() {

return new User();

}

}

(注意:這裡返回的是User這個bean,在這裡new一個User())

(2)在xml中配置,配置時是通過靜態工廠模式拿到JavaBean裡面的欄位,

  1. <bean class="com.lgq.Spring01.UserFactory" factory-method="getInstance" id="user2"/>

(3)測試輸出

@Test

public void test3() {

User user2 = (User) ctx.getBean("user2");

user2.sayHello("zhaoliu");

}

三、例項工廠模式

(1)例項工廠注入與靜態工廠注入基本一致,主要區別體現在工廠方法是不是靜態方法工廠方法示例,建立例項工廠:

public class UserFactory2 {

public User getInstance() {

return new User();

}

}

(2)配置示例,配置與靜態工廠的區別在於工廠模式要經過factory-bean而獲取到裡面的方法。而後實現控制反轉。

<bean class="com.lgq.Spring01.UserFactory2" id="userFactory2"/>

<bean class="com.lgq.Spring01.User" factory-bean="userFactory2" factory-method="getInstance" id="user3"/>

四、屬性注入

(1)構造方法注入

  • 建立一個JavaBean命名為Book;並建立get/set、有參構造、重寫toString等方法
public class Book {   
     private Integer id; 
     private String name;
     private String author;
}
  • 在xml中配置,可以通過nama賦值也可以通過index下標方式賦值
name賦值方式:
<bean class="com.itbaizhan.Book" id="book1">
    <constructor-arg name="id" value="1"/>
    <constructor-arg name="name" value="三國演義"/>
    <constructor-arg name="author" value="羅貫中"/>
</bean>

index下標賦值方式:
<bean class="com.itbaizhan.Book" id="book2">
    <constructor-arg index="0" value="2"/>
    <constructor-arg index="1" value="紅樓夢"/>
    <constructor-arg index="2" value="曹雪芹"/>
</bean>
  • 測試:
    @Test
    public void test1() {
        Book book1 = (Book) ctx.getBean("book1");
        System.out.println(book1);
    }
    @Test
    public void test2() {
        Book book2 = (Book) ctx.getBean("book2");
        System.out.println(book2);
    }
  • 物件注入三種不同的配置方式;
p注入方式:ref拿到物件的屬性
<bean class="com.itbaizhan.User" id="user2">
<constructor-arg name="name" value="里斯"/>
<constructor-arg name="id" value="2"/>
<constructor-arg name="address" value="廣州"/>
<constructor-arg name="cat" ref="cat1"/>
</bean>
<bean class="com.itbaizhan.User" id="user3" p:id="3" p:cat-ref="cat1" p:name="王五"/>    <bean class="com.itbaizhan.User" id="user1">


<property name="name" value="張三"/>
<property name="id" value="1"/>
<property name="address" value="深圳"/>
<property name="cat" ref="cat1"/>
</bean>
<bean class="com.itbaizhan.Cat" id="cat1">
<property name="id" value="1"/>
<property name="name" value="小白"/>
<property name="color" value="白色"/>
</bean>

五、數組合集合的注入方式

1、陣列和集合的注入方式是一致的,無論是基本資料型別還是一個引用,注入方式都是一樣。

首先宣告一個物件,物件中包含集合和陣列:

public class User {
    private Integer id;
    private String name;
    private String address;
    private Cat cat;
    private List<String> favorites;
    private Book[] books;
}

2、然後在xml檔案中進行配置,五路是通過構造方法注入,還是通過set方法注入,都是使用list節點進行注入

<bean class="com.itbaizhan.User" id="user4">        <property name="address" value="廣州"/>        <property name="id" value="4"/>        <property name="name" value="王五"/>        <property name="favorites">            <list>                <value>足球</value>                <value>籃球</value>            </list>        </property>        <property name="books">            <list>                <bean class="com.itbaizhan.Book">                    <property name="name" value="三國演義"/>                    <property name="id" value="1"/>                </bean>                <bean class="com.itbaizhan.Book">                    <property name="id" value="2"/>                    <property name="name" value="紅樓夢"/>                </bean>            </list>        </property>    </bean>    <bean class="com.itbaizhan.Book" id="book1">        <property name="name" value="三國演義"/>        <property name="id" value="1"/>    </bean>    <bean class="com.itbaizhan.Book" id="book2">        <property name="id" value="2"/>        <property name="name" value="紅樓夢"/>    </bean>    <bean class="com.itbaizhan.User" id="user5">        <property name="address" value="廣州"/>        <property name="id" value="4"/>        <property name="name" value="王五"/>        <property name="favorites">            <list>                <value>足球</value>                <value>籃球</value>            </list>        </property>        <property name="books">            <list>               <ref bean="book1"></ref>               <ref bean="book2"></ref>            </list>        </property>    </bean>

 

六、集合方式注入

 

1、宣告Map屬性,注意屬性的key和value的資料型別需要提前定義好,然後在xml檔案中直接使用(xml檔案中配置時,key和屬性的值必須要滿足宣告的要求,否則就會出錯)。宣告方式如下:

private Map<String, Object> info;

 2、xml配置

<bean class="com.itbaizhan.User" id="user5">        <property name="address" value="廣州"/>        <property name="id" value="4"/>        <property name="name" value="王五"/>        <property name="favorites">            <list>                <value>足球</value>                <value>籃球</value>            </list>        </property>        <property name="books">            <list>               <ref bean="book1"></ref>               <ref bean="book2"></ref>            </list>        </property>        <property name="info">            <map>                <entry key="age" value="99"/>                <entry key="cat" value-ref="cat1"/>            </map>        </property>    </bean>