天天看點

Spring配置說明&DI依賴注入一、Spring配置說明二、DI依賴注入

文章目錄

  • 一、Spring配置說明
    • 1.别名
    • 2.Bean的配置
    • 3.import
  • 二、DI依賴注入
    • 1.構造器注入
    • 2.set方式注入
    • 3.拓展方式注入
    • 4.bean的作用域

一、Spring配置說明

1.别名

  • 方式一:alias 标簽
<bean id="user" class="com.gaolang.pojo.User">
        <property name="name" value="高朗"/>
    </bean>

    <!--前面bean的别名-->
    <alias name="user" alias="newUser"/>
           
  • 方式二:bean标簽的name屬性,且更進階,可以取多個别名,逗号或空格等隔開
<bean id="user" class="com.gaolang.pojo.User" name="newUser">
        <property name="name" value="高朗"/>
    </bean>
           
  • 小結:

    别名:如果添加了别名,我們可以使用别名擷取到這個對象

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //别名擷取對象
        User user = (User) context.getBean("newUser");
           

2.Bean的配置

bean元素的常用屬性:

屬性名稱 描述
id 是一個 Bean 的唯一辨別符,Spring 容器對 Bean 的配置和管理都通過該屬性完成
name Spring 容器同樣可以通過此屬性對容器中的 Bean 進行配置和管理,name 屬性中可以為 Bean 指定多個名稱,每個名稱之間用逗号或分号隔開
class 該屬性指定了 Bean 的具體實作類,它必須是一個完整的類名,使用類的全限定名
scope 用于設定 Bean 執行個體的作用域,其屬性值有 singleton(單例)、prototype(原型)、request、session 和 global Session。其預設值是 singleton
constructor-arg <bean>元素的子元素,可以使用此元素傳入構造參數進行執行個體化。該元素的 index 屬性指定構造參數的序号(從 0 開始),type 屬性指定構造參數的類型
property <bean>元素的子元素,用于調用 Bean 執行個體中的 Set 方法完成屬性指派,進而完成依賴注入。該元素的 name 屬性指定 Bean 執行個體中的相應屬性名
ref <property> 和 <constructor-arg> 等元素的子元索,該元素中的 bean 屬性用于指定對 Bean 工廠中某個 Bean 執行個體的引用
value <property> 和 <constractor-arg> 等元素的子元素,用于直接指定一個常量值
list 用于封裝 List 或數組類型的依賴注入
set 用于封裝 Set 類型屬性的依賴注入
map 用于封裝 Map 類型屬性的依賴注入
entry 元素的子元素,用于設定一個鍵值對。其 key 屬性指定字元串類型的鍵值,ref 或 value 子元素指定其值

3.import

有多個不同的beans.xml可以用import标簽導入合并到一個總的applicationContext.xml中,使用的時候,直接使用總的配置就可以了。

<import resource="beans.xml"/>
<import resource="beans2.xml"/>
<import resource="beans3.xml"/>
<import resource="beans4.xml"/>
           

二、DI依賴注入

  • 依賴:bean對象的建立依賴于容器。
  • 注入:bean對象中的所有屬性,由容器來注入。

1.構造器注入

指 IoC 容器使用構造方法注入被依賴的執行個體。基于構造器的 DI 通過調用帶參數的構造方法實作,每個參數代表一個依賴。

2.set方式注入

指 IoC 容器使用 setter 方法注入被依賴的執行個體。通過調用無參構造器或無參 static 工廠方法執行個體化 bean 後,調用該 bean 的 setter 方法,即可實作基于 setter 的 DI。

前面文章有寫到構造器和set方式注入:了解Spring架構

不夠都是一些比較簡單的資料類型的注入,接下來涉及一些其他類型的set方式注入。

包括:String類型,bean,數組,List,Map,Set,null ,Properties

  • UserTest.java
package com.gaolang.pojo;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class UserTest {
    private String name;
    private User user;
    private String[] books;
    private List<String> hobbys;
    private Map<String,String> card;
    private Set<String> games;
    private String girlfriend;
    private Properties info;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String[] getBooks() {
        return books;
    }

    public void setBooks(String[] books) {
        this.books = books;
    }

    public List<String> getHobbys() {
        return hobbys;
    }

    public void setHobbys(List<String> hobbys) {
        this.hobbys = hobbys;
    }

    public Map<String, String> getCard() {
        return card;
    }

    public void setCard(Map<String, String> card) {
        this.card = card;
    }

    public Set<String> getGames() {
        return games;
    }

    public void setGames(Set<String> games) {
        this.games = games;
    }

    public String getGirlfriend() {
        return girlfriend;
    }

    public void setGirlfriend(String girlfriend) {
        this.girlfriend = girlfriend;
    }

    public Properties getInfo() {
        return info;
    }

    public void setInfo(Properties info) {
        this.info = info;
    }
}
           
  • beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.gaolang.pojo.User">
        <property name="name" value="高朗"/>
    </bean>

    <bean id="userT" class="com.gaolang.pojo.UserTest">
        <!--String類型注入-->
        <property name="name" value="小明"/>
        <!--bean 注入-->
        <property name="user" ref="user"/>
        <!--數組注入-->
        <property name="books">
            <array>
                <value>傅雷家書</value>
                <value>紅樓夢</value>
                <value>水浒傳</value>
            </array>
        </property>
        <!--List注入-->
        <property name="hobbys">
            <list>
                <value>打籃球</value>
                <value>晨跑</value>
                <value>聽歌</value>
            </list>
        </property>
        <!--Map注入-->
        <property name="card">
            <map>
                <entry key="身份證" value="123"/>
                <entry key="學生證" value="456"/>
                <entry key="銀行卡" value="789"/>
            </map>
        </property>
        <!--Set注入-->
        <property name="games">
            <set>
                <value>LOL</value>
                <value>GAME2</value>
                <value>GAME3</value>
            </set>
        </property>
        <!--null注入-->
        <property name="girlfriend">
            <null/>
        </property>

        <!--Properties注入
        key=value
        -->
        <property name="info">
            <props>
                <prop key="driver">VALUE1</prop>
                <prop key="url">VALUE2</prop>
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
    </bean>
</beans>
           
  • 測試類MyTest.java
public class MyTest {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        UserTest userT = (UserTest) context.getBean("userT");
        System.out.println(userT.toString());

    }
}
           
  • 運作結果:
UserTest{name='小明', 
user=User{name='高朗'},
 books=[傅雷家書, 紅樓夢, 水浒傳],
 hobbys=[打籃球, 晨跑, 聽歌],
 card={身份證=123, 學生證=456, 銀行卡=789}, 
 games=[LOL, GAME2, GAME3], girlfriend='null', 
 info={password=123456, url=VALUE2, driver=VALUE1, username=root}}

           

3.拓展方式注入

我們可以用p命名空間和c命名空間,但是不能直接使用,需要導入xml限制:

  • p命名空間:使用的是set方式注入,使用的話,需要有set方法
xmlns:p="http://www.springframework.org/schema/p"
           
  • c命名空間:構造器注入,需要有參構造器
xmlns:c="http://www.springframework.org/schema/c"
           
  • p命名空間和c命名空間的具體使用:

userbeans.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--p命名空間注入,可以直接注入屬性的值:set注入-->
    <bean id="user" class="com.gaolang.pojo.User" p:name="高朗" p:age="18"/>

    <!--c命名空間注入,可以直接注入屬性的值:構造器注入-->
    <bean id="user2" class="com.gaolang.pojo.User" c:name="小明" c:age="20"/>
</beans>
           

MyTest.java

@Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");

        //p指令空間
        User user = (User) context.getBean("user");
        System.out.println(user.toString());

        //c指令空間
        User user2 = (User) context.getBean("user2");
        System.out.println(user2.toString());
    }
           

運作結果:

User{name='高朗', age=18}
User{name='小明', age=20}
           

4.bean的作用域

Spring配置說明&amp;DI依賴注入一、Spring配置說明二、DI依賴注入

1)singleton

單例模式,使用 singleton 定義的 Bean 在 Spring 容器中隻有一個執行個體,這也是 Bean 預設的作用域。

2)prototype

原型模式,每次通過 Spring 容器擷取 prototype 定義的 Bean 時,容器都将建立一個新的 Bean 執行個體。

3)request

在一次 HTTP 請求中,容器會傳回該 Bean 的同一個執行個體。而對不同的 HTTP 請求,會傳回不同的執行個體,該作用域僅在目前 HTTP Request 内有效。

4)session

在一次 HTTP Session 中,容器會傳回該 Bean 的同一個執行個體。而對不同的 HTTP 請求,會傳回不同的執行個體,該作用域僅在目前 HTTP Session 内有效。

5)global Session

在一個全局的 HTTP Session 中,容器會傳回該 Bean 的同一個執行個體。該作用域僅在使用 portlet context 時有效。

最常用的是第一種和第二種:

  1. 單例模式:(Spring預設的模式)

    scope="singleton"

Spring配置說明&amp;DI依賴注入一、Spring配置說明二、DI依賴注入

隻有一個對象被建立

User user = (User) context.getBean("user");
User user2 = (User) context.getBean("user");
           

user和user2是同一個對象,hashcode相同。

  1. 原型模式:

    scope="prototype"

Spring配置說明&amp;DI依賴注入一、Spring配置說明二、DI依賴注入

每次從容器中get的時候,都會産生一個新對象。

User user = (User) context.getBean("user");
User user2 = (User) context.getBean("user");
System.out.println(user==user2);
           

user和user2是不同的對象