最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

首頁(yè) 慕課教程 Spring 入門(mén)教程 Spring 入門(mén)教程 Spring IoC (控制反轉(zhuǎn))之 xml 配置

Spring IoC (控制反轉(zhuǎn))之 xml 配置

1. 前言

本小節(jié)目的在于帶領(lǐng)大家熟練 xml 文件配置, 應(yīng)用 xml 文件配置 IoC。

在第二節(jié)中我們通過(guò)一個(gè)入門(mén)工程簡(jiǎn)單地體驗(yàn)了一把 Spring 的使用。在第三節(jié)中梳理了一下 Spring 的工作流程。

大家有了一個(gè)初步認(rèn)知,Spring 框架的工作脫離不了核心配置文件 applicationContext.xml。

在配置文件中我們目前只用到了一個(gè) bean 標(biāo)簽,它的作用是用于描述 Java 的類(lèi),讓框架啟動(dòng)加載配置文件實(shí)例化的。

疑問(wèn)導(dǎo)出

那么我們知道描述一個(gè)類(lèi)有幾個(gè)要素,類(lèi)名、屬性、構(gòu)造函數(shù) set 和 get 方法對(duì)吧?而 bean 標(biāo)簽如何描述一個(gè)詳細(xì)的類(lèi)呢?

帶著疑問(wèn)… 開(kāi)始本節(jié)內(nèi)容。

2.bean 標(biāo)簽中的屬性介紹

核心配置文件回顧

<bean id="user" class="com.wyan.entity.User" ></bean>  


在上面的代碼中可以看到,在 bean 標(biāo)簽中有兩個(gè)屬性,一個(gè)是 id 一個(gè)是 class。那么在 bean 標(biāo)簽中都有哪些屬性呢?

屬性列表

學(xué)號(hào) 姓名
id 定義的唯一標(biāo)識(shí)
name 同 id 的意義一致
class 類(lèi)
factory-bean 工廠對(duì)象
factory-method 工廠方法
init-method 初始化執(zhí)行的方法
destroy-method 銷(xiāo)毀執(zhí)行的方法
scope 對(duì)象的作用域
lazy-init 懶加載
autowire 依賴(lài)注入
depends-on 依賴(lài)于某個(gè)實(shí)例

疑問(wèn)導(dǎo)出

上述屬性是配置 bean 標(biāo)簽中可以選擇的屬性,當(dāng)然一般來(lái)講,我們無(wú)需配置所有,可以根據(jù)自己的需求配置需要的屬性信息,那么如何選擇這些屬性呢?

2.1 屬性詳細(xì)解釋

2.1.1 id 和 name 標(biāo)簽的使用

我們目前已經(jīng)知道所有被實(shí)例化后的對(duì)象都存在于 Spirng 的容器中,那么從容器中獲取這些對(duì)象需要一個(gè)屬性 id 對(duì)吧?那么 name 和 id 有什么關(guān)系呢?

查看官方文檔得知 Spring 的容器會(huì)給初始化的每個(gè) bean 都定義一個(gè)或多個(gè)標(biāo)識(shí)符。這些標(biāo)識(shí)符在容器內(nèi)必須是唯一的。一個(gè) bean 通常只有一個(gè)標(biāo)識(shí)符。而 name 和 id 都可以起到標(biāo)識(shí)符的作用。

所以在 XML 配置文件,我們一般使用 id 或者 name 屬性,定義 bean 的唯一標(biāo)識(shí),
這樣我們才能通過(guò)定義好的唯一標(biāo)識(shí),從 Spring 的容器中獲取他們。
代碼實(shí)例:

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
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" name="user2" class="com.wyan.entity.User" ></bean>

</beans>

測(cè)試代碼如下:

	public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        System.out.println(context.getBean("user"));
        System.out.println(context.getBean("user2"));
    }

結(jié)果如圖所示:

圖片描述
結(jié)論證明

我們通過(guò) bean 標(biāo)簽中的 id 屬性 user, 或者使用 bean 標(biāo)簽中的 name 屬性 user2, 都可以得到 Spring 容器中的 user 對(duì)象的示例,而且打印的地址是同一個(gè)。我們之前說(shuō)過(guò)一句,默認(rèn)在容器中的實(shí)例都是單例的,在這里也得到了證明。

2.1.2 class 屬性

bean 標(biāo)簽的定義實(shí)質(zhì)上是創(chuàng)建一個(gè)或多個(gè)對(duì)象的方法。當(dāng) xml 文件被解析加載的時(shí)候,使用該 bean 定義封裝的配置數(shù)據(jù)來(lái)創(chuàng)建(或獲?。?shí)際對(duì)象,而創(chuàng)建獲取的對(duì)象是誰(shuí)呢?就是通過(guò) class 屬性中定義的類(lèi)的全路徑來(lái)指定 。

一般來(lái)講 class 中的類(lèi)實(shí)例化有兩種方式

? 一種是反射 ,相當(dāng)于我們使用的 new 關(guān)鍵字。這種也是我們常用的方式。當(dāng)然不要忘記提供無(wú)參數(shù)的構(gòu)造方法(類(lèi)中默認(rèn)有無(wú)參構(gòu)造,但是如果自定義了有參構(gòu)造,默認(rèn)的無(wú)參不會(huì)提供)

? 一種是工廠模式 ,需要借助于 factory-bean 和 factory-method 兩個(gè)屬性,這種方式不常用,我們可以了解下。

2.1.3 factorybean 和 factorymethod 屬性

這兩個(gè)屬性主要用于工廠模式實(shí)例化 bean 的時(shí)候使用,不是很常見(jiàn)。工廠模式有兩種,這里分別做個(gè)實(shí)例,幫助大家理解。

靜態(tài)工廠模式實(shí)例:

<!--applicationContext的配置bean節(jié)點(diǎn)-->
<bean id="user" class="com.wyan.entity.User" factory-method="createUserInstance"/>

創(chuàng)建 bean 示例的 Java 工廠類(lèi):

public class User {
    
    private static User user = new User();
    
    private User() {}

    public static User createInstance() {
        return user;
    }
}

解釋?zhuān)涸诙x使用靜態(tài)工廠方法創(chuàng)建的 bean 時(shí),class 屬性指定的是被創(chuàng)建的類(lèi),包含靜態(tài)的方法,并使用 factory-method 屬性來(lái)指定工廠方法本身名稱(chēng)。

普通工廠模式

<!--spring實(shí)例化工廠對(duì)象 用于創(chuàng)建java實(shí)例 -->
<bean id="beanFactory" class="com.wyan.factory.BeanFactory"></bean>
<!-- 被工廠創(chuàng)建的對(duì)象實(shí)例 -->
<bean id="user1" factory-bean="beanFactory" factory-method="createUser1"/>

工廠類(lèi)代碼:

public class BeanFactory {

    private static User1 user1 = new User1();

    private static User2 user2 = new User2();

    public User1 createUser1() {
        return user1;
    }

    public User2 createUser2() {
        return user2;
    }
}

解釋?zhuān)合葘?shí)例化先創(chuàng)建各個(gè)對(duì)象示例的工廠對(duì)象到容器中,自身的 bean 標(biāo)簽將 class 屬性保留為空,并在 factory-bean 屬性中指定當(dāng)前容器中的工廠 Bean 名稱(chēng),再使用 factory-method 屬性設(shè)置創(chuàng)建示例的方法名稱(chēng)。

2.1.4 init-method 和 destroy-method 屬性的使用

這兩個(gè)屬性比較好理解 init-method 就是 bean 被初始化后執(zhí)行的方法,destory-method 就是 bean 被銷(xiāo)毀執(zhí)行的代碼。

我們來(lái)個(gè)測(cè)試類(lèi)

public class User {

    public User(){
        System.out.println("我被spring實(shí)例化了");
    }

    public void initMethod(){
        System.out.println("user類(lèi)實(shí)例化時(shí)候執(zhí)行的代碼");
    }
    public void destoryMethod(){
        System.out.println("user類(lèi)實(shí)例被銷(xiāo)毀時(shí)候執(zhí)行的代碼");
    }
}

配置文件

 <bean id="user" name="user2" class="com.wyan.entity.User" init-method="initMethod" destroy-method="destoryMethod" ></bean>**

測(cè)試代碼:

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

加載 Spring 的配置文件控制臺(tái)打印如下:
圖片描述

有個(gè)小疑問(wèn):銷(xiāo)毀語(yǔ)句沒(méi)打印呢?那是因?yàn)椴](méi)有調(diào)用容器的銷(xiāo)毀方法。

改造測(cè)試代碼如下:

	public static void main(String[] args) {
        AbstractApplicationContext context =
                new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        context.close();
    }

解釋?zhuān)篈pplicationContext 沒(méi)有 close 方法使用它的子類(lèi)

運(yùn)行結(jié)果:

圖片描述

2.1.5 其余屬性作用

scope :指定示例的作用范圍,后續(xù)章節(jié)詳細(xì)講解;

lazy-init :表示是否為懶加載;

autowire :指定屬性注入方式,后續(xù)章節(jié)詳解;

depends-on: 表示是否有依賴(lài)的 bean 對(duì)象,后續(xù)依賴(lài)注入章節(jié)詳細(xì)解釋。

2.2 構(gòu)造函數(shù)的使用

剛剛我們?cè)敿?xì)解釋了 bean 標(biāo)簽內(nèi)部的屬性,經(jīng)過(guò)幾個(gè)小實(shí)例以后不禁也有個(gè)問(wèn)題:

如果我們定義的類(lèi)中有一些初始化的參數(shù),并且定義好了有參數(shù)的構(gòu)造,通過(guò) xml 配置文件如何體現(xiàn)呢?

實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單,跟我來(lái)進(jìn)行一個(gè)小實(shí)例:

改造 User 類(lèi)

這是一個(gè)普通的 Java 類(lèi)對(duì)象,包含兩個(gè)屬性及其 get 和 set 方法,并且提供了空參構(gòu)造和有參構(gòu)造,為了測(cè)試方便再覆寫(xiě)一個(gè) toString 方法。

public class User {

    private Integer id;
    private String name;
    
    public User() {
    }
    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

xml 配置文件方式

    <bean id="user"  class="com.wyan.entity.User"  >
        <constructor-arg name="id" value="1"></constructor-arg>
        <constructor-arg name="name" value="zs"></constructor-arg>
    </bean>

測(cè)試結(jié)果

圖片描述
其實(shí)對(duì)于有參構(gòu)造實(shí)例化對(duì)象而言,使用一個(gè)標(biāo)簽 constructor-arg 即可,表示構(gòu)造的參數(shù),如果有多個(gè),可以繼續(xù)添加,這里不多做演示。

疑問(wèn)導(dǎo)出

可能有同學(xué)會(huì)想,那么如果以后我們的屬性需要?jiǎng)討B(tài)更改呢?或者我們的屬性不是基本類(lèi)型而是另外的對(duì)象呢? 后續(xù)在第三章依賴(lài)注入多種屬性的小節(jié)給大家講解 。

3. 小結(jié)

本章節(jié)帶著大家詳細(xì)解釋了 bean 標(biāo)簽的使用,那么通過(guò)本章節(jié)我們收獲了哪些呢?

  1. 容器內(nèi)部命名唯一標(biāo)識(shí)可以通過(guò) id 也可以通過(guò) name;

  2. 實(shí)例化對(duì)象有兩種方式 反射模式和工廠模式;

  3. 如果是反射模式,那么必須配置 class 屬性,因?yàn)樾枰?class 屬性中類(lèi)的全路徑來(lái)實(shí)例化 bean 對(duì)象;

  4. 如果需要在類(lèi)實(shí)例化初始化參數(shù),可以使用 init 方法也可以使用有參構(gòu)造。

持之以恒的學(xué)習(xí)是成功的最快捷徑… 切記眼高手低。