Spring學習6(1)Spring配置概述以及Bean基本配置
Spring學習6(1)
學習5中主要學習的是Ioc的容器的整體概念,這裡(即是書中第5章)主要開始對Bean的配置進行學習。
Spring配置概述
Spring容器高層檢視
要使應用程式中的Spring容器成功啟動,需要同時具備以下三方面條件:
- Spring 框架的類包都已經放到應用程式的類路徑下
- 應用程式為spring提供了完備的Bean配置資訊
- Bean的類都已經放到應用程式的類路徑下
具體關係與過程如下圖所示:
Bean配置資訊是Bean的元資料資訊,其由下列四個方面組成:
- Bean的實現類
- Bean的屬性資訊:如使用者名稱,密碼等
- Bean的依賴關係
- Bean的行為配置:如生命週期範圍及各個過程的回撥函式
基於XML的配置
spring2.0後xml使用Schema格式,讓不同型別的配置擁有了自己的名稱空間,使配置檔案更具擴充套件性和簡易性。
<?xml version="1.0" encoding="UTF-8" ?>
<beans
<!-- 預設名稱空間 -->
xmlns="http://www.springframework.org/schema/beans"
<!-- xsi標準名稱空間,用於指定自定義名稱空間的Schema檔案-->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!-- aop為自定義名稱空間名稱的簡稱,後面的url是名稱空間的全稱,指定具體Schema檔案 -->
xmlns:aop="http://www.springframework.org/schema/aop"
<!-- 為每個名稱空間指定具體Schema檔案 -->
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- 預設名稱空間的配置 -->
<bean id="foo" class="com.smart.Foo"/>
<!-- aop名稱空間的配置 -->
<aop:config>
<aop:advisor pointcut="execution(* *..PetStoreFacade.*(..))"
advice-ref="texAdvice"/>
</aop:config>
</beans>
在上面的程式碼用xmlns的方式對文件所引用的名稱空間進行申明,上述程式碼定義了三個名稱空間:
- 預設名稱空間,沒有空間名,用於Spring Bean的定義
- xsi標準名稱空間,用於為每個文件中的名稱空間指定相應的Schema樣式檔案。
- aop名稱空間,是spring配置Aop的名稱空間,即是一種自定義的名稱空間。
名稱空間的定義
名稱空間的定義分為兩個步驟:
- 指定名稱空間的名稱
- 指定名稱空間的schema文件格式檔案的位置,用空格或回車換行進行分隔。
在第一步中需要指定名稱空間的縮略名和全名,如上述程式碼中定義的:
xmlns:aop="http://www.springframework.org/shema/aop"
。aop為名稱空間的別名,文件後面的元素可以通過名稱空間名加以區別,如<aop:config>
等。
如果名稱空間的別名為空,則是預設名稱空間,如<beans/>
,<bean/>
等。
Bean基本配置
在Spring容器的配置檔案中定義一個簡要的Bean配置片段如下:
<bean id="Bean的名稱" class="Bean的類名"/>
容器可以直接根據id的名字利用getBean(id)的方法得到所需的Bean。它是在容器中起到定位查詢的作用,在外部程式中是和spring Ioc容器進行互動的橋樑。
一般情況下,我們需要為一個Bean指定一個id屬性作為Bean的名稱,id在IoC容器中必須是唯一的,而且id的命名需要滿足XML對id的命名規範,必須以字母開始,以完整結束符號結束。
在實際情況下,使用者可以使用name的屬性來提供BeanName,一個bean可以有多個id,多個name,可以用逗號,分號或者空格進行分隔,如:
<bean name="#car1, 123, $car"...>
但是在獲取Bean的時候如果有兩個相同neam時,會採用後定義的bean。
如果id和name兩個屬性都沒有指定,那麼會將Bean的類名作為id,多個實現類相同的匿名bean如下所示時:
<bean class="class.smart.simple.Car"/>
<bean class="class.smart.simple.Car"/>
<bean class="class.smart.simple.Car"/>
其id就分別設為:
com.smart.simple.Car
com.smart.simple.Car#1
com.smart.simple.Car#2
後續若還有更多匿名類則以此類推。