Spring系列第四講 xml中bean定義詳解

qwer1030274531發表於2020-10-28

bean概念回顧

我們再來回顧一下,被spring管理的物件統稱為bean,我們程式中需要用到很多物件,我們將這些物件讓spring去幫我們建立和管理,我們可以透過bean xml配置檔案告訴spring容器需要管理哪些bean,spring幫我們建立和組裝好這些bean物件;那麼我們如何從spring中獲取想要的bean物件呢,我們需要給bean定義一個名稱,spring內部將這些名稱和具體的bean物件進行繫結,然後spring容器可以透過這個的名稱找對我們需要的物件,這個名稱叫做bean的名稱,在一個spring容器中需要是唯一的。

bean xml配置檔案格式

bean xml檔案用於定義spring容器需要管理的bean,常見的格式如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="
       xmlns:xsi="
       xsi:schemaLocation="
    /spring-beans-4.3.xsd">
    <import resource="引入其他bean xml配置檔案" />
    <bean id="bean標識" class="玩轉型別名稱"/>
    <alias name="bean標識" alias="別名" /></beans>1234567891011

beans是根元素,下面可以包含任意數量的import、bean、alias元素,下面我們對每個元素進行詳解。

bean元素

用來定義一個bean物件。

格式

<bean id="bean唯一標識" name="bean名稱" class="完整型別名稱" factory-bean="工廠bean名稱" factory-method="工廠方法"/>1

bean名稱

每個bean都有一個名稱,叫做bean名稱,bean名稱在一個spring容器中必須唯一,否則會報錯,透過bean名稱可以從spring容器獲取對應的bean物件。

bean別名

先來說一下什麼是別名?

相當於人的外號一樣,一個人可能有很多外號,當別人喊這個人的名稱或者外號的時候,都可以找到這個人。那麼bean也一樣,也可以給bean起幾個外號,這個外號在spring中叫做bean的別名,spring容器允許使用者透過名稱或者別名獲取對應的bean物件。

bean名稱別名定義規則

名稱和別名可以透過bean元素中的id和name來定義,具體定義規則如下::

  1. 當id存在的時候,不管name有沒有,取id為bean的名稱

  2. 當id不存在,此時需要看name,name的值可以透過,;或者空格分割,最後會按照分隔符得到一個String陣列,陣列的第一個元素作為bean的名稱,其他的作為bean的別名

  3. 當id和name都存在的時候,id為bean名稱,name用來定義多個別名

  4. 當id和name都不指定的時候,bean名稱自動生成,生成規則下面詳細說明

案例

下面演示一下bean名稱和別名的各種寫法。

<!-- 透過id定義bean名稱:user1 --><bean id="user1" class="com.javacode2018.lesson001.demo2.UserModel"/><!-- 透過name定義bean名稱:user2 --><bean name="user2" class="com.javacode2018.lesson001.demo2.UserModel"/><!-- id為名稱,name為別名;bean名稱:user3,1個別名:[user3_1] --><bean id="user3" name="user3_1" class="com.javacode2018.lesson001.demo2.UserModel"/><!-- bean名稱:user4,多個別名:[user4_1,user4_2,user4_3,user4_4] --><bean id="user4" name="user4_1,user4_2;user4_3 user4_4" class="com.javacode2018.lesson001.demo2.UserModel"/><!-- bean名稱:user5,別名:[user5_1,user5_2,user5_3,user5_4] --><bean name="user5,user5_1,user5_2;user5_3 user5_4" class="com.javacode2018.lesson001.demo2.UserModel"/>1234567891011121314

我們來寫個java來輸出上面所有bean的名稱和其別名,如下:

package com.javacode2018.lesson001.demo2;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.Arrays;public class Client {
    public static void main(String[] args) {
        //1.bean配置檔案位置
        String beanXml = "classpath:/com/javacode2018/lesson001/demo2/beans.xml";
        //2.建立ClassPathXmlApplicationContext容器,給容器指定需要載入的bean配置檔案
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(beanXml);
        for (String beanName : Arrays.asList("user1", "user2", "user3", "user4", "user5")) {
            //獲取bean的別名
            String[] aliases = context.getAliases(beanName);
            System.out.println(String.format("beanName:%s,別名:[%s]", beanName, String.join(",", aliases)));
        }
        System.out.println("spring容器中所有bean如下:");
        //getBeanDefinitionNames用於獲取容器中所有bean的名稱
        for (String beanName : context.getBeanDefinitionNames()) {
            //獲取bean的別名
            String[] aliases = context.getAliases(beanName);
            System.out.println(String.format("beanName:%s,別名:[%s]", beanName, String.join(",", aliases)));
        }
    }}123456789101112131415161718192021222324252627282930313233

上面有2個新的方法:

getAliases:透過bean名稱獲取這個bean的所有別名

getBeanDefinitionNames:返回spring容器中定義的所有bean的名稱

執行輸出:

beanName:user1,別名:[]beanName:user2,別名:[]beanName:user3,別名:[user3_1]beanName:user4,別名:[user4_1,user4_4,user4_2,user4_3]beanName:user5,別名:[user5_3,user5_4,user5_1,user5_2]spring容器中所有bean如下:
beanName:user1,別名:[]beanName:user2,別名:[]beanName:user3,別名:[user3_1]beanName:user4,別名:[user4_1,user4_4,user4_2,user4_3]beanName:user5,別名:[user5_3,user5_4,user5_1,user5_2]1234567891011

id和name都未指定

當id和name都未指定的時候,bean的名稱和別名又是什麼呢?此時由spring自動生成,bean名稱為:

bean的class的完整類名#編號1

上面的編號是從0開始的,同種型別的沒有指定名稱的依次遞增。

如: xinyang/

下面定義了2個UserModel和2個String型別的bean,這些bean都沒有指定id和name。

<bean class="com.javacode2018.lesson001.demo2.UserModel" /><bean class="com.javacode2018.lesson001.demo2.UserModel" /><bean class="java.lang.String" /><bean class="java.lang.String" />12345

我們再次執行一下上面Client類的main方法,輸出:

beanName:user1,別名:[]beanName:user2,別名:[]beanName:user3,別名:[user3_1]beanName:user4,別名:[user4_1,user4_4,user4_2,user4_3]beanName:user5,別名:[user5_3,user5_4,user5_1,user5_2]spring容器中所有bean如下:
beanName:user1,別名:[]beanName:user2,別名:[]beanName:user3,別名:[user3_1]beanName:user4,別名:[user4_1,user4_4,user4_2,user4_3]beanName:user5,別名:[user5_3,user5_4,user5_1,user5_2]beanName:com.javacode2018.lesson001.demo2.UserModel#0,別名:[com.javacode2018.lesson001.demo2.UserModel]beanName:com.javacode2018.lesson001.demo2.UserModel#1,別名:[]beanName:java.lang.String#0,別名:[java.lang.String]beanName:java.lang.String#1,別名:[]123456789101112131415

注意看一下上面最後4行的輸出,bean名稱和別名都是自動生成的,未指定id和name的bean物件,第一個會有別名,別名為完整的類名。bean名稱為完整類名#編號。

alias元素

alias元素也可以用來給某個bean定義別名,語法:

<alias name="需要定義別名的bean" alias="別名" />1

如:

<bean id="user6" class="com.javacode2018.lesson001.demo2.UserModel" /><alias name="user6" alias="user6_1" /><alias name="user6" alias="user6_2" />123

上面第一行透過bean元素定義了一個名稱為user6的UserModel物件,後面2行給user6這個bean定義了2個別名,分別是user6_1和user6_2。

執行Client,會輸出一行:

beanName:user6,別名:[user6_2,user6_1]1

import元素 puyang/

當我們的系統比較大的時候,會分成很多模組,每個模組會對應一個bean xml檔案,我們可以在一個總的bean xml中對其他bean xml進行彙總,相當於把多個bean xml的內容合併到一個裡面了,可以透過import元素引入其他bean配置檔案。

語法:

<import resource="其他配置檔案的位置" />1

如:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="
       xmlns:xsi="
       xsi:schemaLocation="
    /spring-beans-4.3.xsd">
    <import resource="user.xml" />
    <import resource="order.xml" /></beans>12345678910

總結

本文主要介紹了xml bean的定義,名稱和別名的使用,透過import元素引入外部配置檔案。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2730700/,如需轉載,請註明出處,否則將追究法律責任。

相關文章