本文內容
- bean xml配置文件
- bean元素詳解
- 名稱和別名詳解
- alias元素詳解
- 通過import元素引入外部配置
環境
- jdk1.8
- idea
- maven-3.6.1
- 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來定義,具體定義規則如下::
- 當id存在的時候,不管name有沒有,取id為bean的名稱
- 當id不存在,此時需要看name,name的值可以通過,;或者空格分割,最後會按照分隔符得到一個String數組,數組的第一個元素作為bean的名稱,其他的作為bean的別名
- 當id和name都存在的時候,id為bean名稱,name用來定義多個別名
- 當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元素引入外部配置文件。
閱讀更多 梧桐清水 的文章
關鍵字: XML