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

本文內容

  1. bean xml配置文件
  2. bean元素詳解
  3. 名稱和別名詳解
  4. alias元素詳解
  5. 通過import元素引入外部配置

環境

  1. jdk1.8
  2. idea
  3. maven-3.6.1
  4. spring-5.2.3.RELEASE

bean概念回顧

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

bean xml配置文件格式

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

<code>
<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>
<bean>
<alias>

/<beans>
/<code>

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

bean元素

用來定義一個bean對象。

格式

<code><bean>
/<code>

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名稱和別名的各種寫法。

<code>
<bean>


<bean>


<bean>


<bean>


<bean>
/<code>

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

<code>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)));
}

}
}
/<code>

上面有2個新的方法:
getAliases:通過bean名稱獲取這個bean的所有別名
getBeanDefinitionNames:返回spring容器中定義的所有bean的名稱

運行輸出:

<code>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]
/<code>

id和name都未指定

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

<code>bean的class的完整類名#編號
/<code>

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

如:

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

<code><bean>
<bean>

<bean>
<bean>
/<code>

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

<code>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,別名:[]
/<code>

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

alias元素

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

<code><alias>
/<code>

如:

<code><bean>
<alias>
<alias>
/<code>

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

運行Client,會輸出一行:

<code>beanName:user6,別名:[user6_2,user6_1]
/<code>

import元素

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

語法:

<code><import>
/<code>

如:

<code>
<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>
<import>

/<beans>
/<code>

總結

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


分享到:


相關文章: