Spring系列:xml中bean定義詳解(-)



版權聲明:本文為CSDN博主「路人甲Java」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/likun557/article/details/104284839

========================================================================================================================================================

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="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-4.3.xsd">

    <import resource="引入其他bean xml配置文件" />
    <bean id="bean標識" class="玩轉類型名稱"/>
    <alias name="bean標識" alias="別名" />

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

bean元素
用來定義一個bean對象。

格式
<bean id="bean唯一標識" name="bean名稱" class="完整類型名稱" factory-bean="工廠bean名稱" factory-method="工廠方法"/>
bean名稱
每個bean都有一個名稱,叫做bean名稱,bean名稱在一個spring容器中必須唯一,否則會報錯,通過bean名稱可以從spring容器獲取對應的bean對象。

bean別名
先來說一下什么是別名?

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

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

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

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

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

當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"/>
我們來寫個java來輸出上面所有bean的名稱和其別名,如下:

package com.javacode2018.lesson001.demo2;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Arrays;

/**
 * 公眾號:路人甲Java,工作10年的前阿里P7分享Java、算法、數據庫方面的技術干貨!堅信用技術改變命運,讓家人過上更體面的生活!
 */
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)));
        }

    }
}
上面有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]
id和name都未指定
當id和name都未指定的時候,bean的名稱和別名又是什么呢?此時由spring自動生成,bean名稱為:

bean的class的完整類名#編號
上面的編號是從0開始的,同種類型的沒有指定名稱的依次遞增。

如:

下面定義了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" />
我們再次運行一下上面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,別名:[]
注意看一下上面最后4行的輸出,bean名稱和別名都是自動生成的,未指定id和name的bean對象,第一個會有別名,別名為完整的類名。bean名稱為完整類名#編號。

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

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

<bean id="user6" class="com.javacode2018.lesson001.demo2.UserModel" />
<alias name="user6" alias="user6_1" />
<alias name="user6" alias="user6_2" />
上面第一行通過bean元素定義了一個名稱為user6的UserModel對象,后面2行給user6這個bean定義了2個別名,分別是user6_1和user6_2。

運行Client,會輸出一行:

beanName:user6,別名:[user6_2,user6_1]
import元素
當我們的系統比較大的時候,會分成很多模塊,每個模塊會對應一個bean xml文件,我們可以在一個總的bean xml中對其他bean xml進行匯總,相當於把多個bean xml的內容合並到一個里面了,可以通過import元素引入其他bean配置文件。

語法:

<import resource="其他配置文件的位置" />
如:

<?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-4.3.xsd">

    <import resource="user.xml" />
    <import resource="order.xml" />

</beans>
總結
本文主要介紹了xml bean的定義,名稱和別名的使用,通過import元素引入外部配置文件。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM