本次主要介紹Spring Bean的內容模型,通過對內容模型的瞭解使開發者能夠對Spring Bean有一個全局的認識。關於Spring Bean的詳細信息可以參考spring-beans.xsd這個文件。在這裏,我們只介紹一些常用的元素。
beans是spring-beans.xsd的根節點,下圖給出了beans的內容模型:
先介紹下beans節點中的屬性
1.default-lazy-init
在內容模型中定義爲:
<!ATTLIST beans default-lazy-init (true|false)”false”>
全局設定,
作用爲:確定Spring定義Java Bean是否需要延遲加載,默認值爲false。
開發者可以在bean定義級別通過lazy-init屬性值來覆蓋beans中定義的default-lazy-init屬性值。
2.default-dependency-check
在內容模型中的定義爲:
<!ATTLIST beans default-dependency-check (none|objects|simple|all) “none”>
全局設定,
作用爲:確定Spring是否需要對Java Bean以及Java Bean之間的依賴關係進行判斷,默認值爲none,即不進行依賴關係的判斷。
"simple”表示需要對Java Bean中使用的java原型String來進行判讀。
"objects”表示需要對Java Bean之間的依賴關係來進行判斷。
"all”表示上述兩個方面都需要判斷。
開發者可以在bean定義級別通過dependency-check來覆蓋beans中定義的default-dependency-check屬性值。
3.default-autowire
在內容模型中的定義爲:
<!ATTLIST beans default-autowire (none|byName|byType|constructor|autodetect) “no”>
作用爲:是否藉助與Spring提供的autowire功能,以注入Java Bean之間的引用關係。
即開發者不用顯式的在Spring配置文件中給出Java Bean對其他Java Bean的引用。
不建議使用,其默認值也是no
"byName":根據java bean 的屬性名來進行autowire的操作。
"byType":根據java bean的屬性類型來進行autowire的操作。前提是在Spring BeanFactory當中僅存在單個類型的java bean定義。
"constructor":在Spring BeanFactory當中僅存在一個的constructor定義。
"autodetect":藉助constructor或者byType來進行autowire的操作的。
接下來介紹一下beans的子元素:
- description:可選元素,描其所在Spring配置文件的內容描述。
- import:可選元素,用於導入其他Spring的配置文件。
- bean:用於定義Java Bean。
接下來我們對bean元素的屬性以及其子元素的所有信息來進行詳細的介紹:
bean元素:bean元素是Beans元素的子節點,通常用於定義Java Bean。開發者可以藉助Java Bean的屬性或者構建器參數來定義Java Bean
先來認識下bean元素的相關屬性:
- Id:通過id來訪問SpringBeanFactory中的java bean
- name: 通過name來訪問SpringBeanFactory中的java bean,在某種意義上來講name就是id的別稱。
- class:java bean定義的全限定名,即包名+類名。假如配置文件中沒有指定id或name的取值,那麼class即作爲id的取值。
- parent:如果沒有指定class屬性的話則可以使用parent,他們的含義是等效的。而且parent java bean 定義不僅能夠繼承parent當中定義的所有內容,而且還能夠覆蓋parent當中定義的相關內容。比如覆蓋java bean方法:init、destory等內容。當然某些parent設置是不能被覆蓋的,比如:依賴關係、autowire的值、作用域。
- abstract:當值爲true的時候,表明相應的java bean定義只是供parent使用,其本身是不能夠被實例化的。默認值爲false。
- scope:bean的作用域,Spring當中提供了5種作用域。
- lazy-init:延遲加載屬性,只有當用到這個bean的時候,Spring纔會進行實例化。
- autowire:開發者是否使用Spring提供的autowire功能,建議不使用,默認值爲no
- dependency-check:Spring是否需要對java bean 以及java bean之間的依賴關係來進行判斷。定義此屬性將會覆蓋在beans中定義的default-dependency-check屬性。
- depends-on:用於保證相應的java bean在其指定depends-on的java bean實例化之後,纔去實例化使用了depends-on的java bean的本身。
- init-method:主要用於設置在實例化java bean,並設置java bean的屬性之後,待執行的初始化方法。
- destroy-method:當中SpringBeanFactory銷燬的時候,可以利用此方法來進行一些資源回收的操作。或者一些其他的操作,比如關閉同GMS目的地的監聽以及連接。在這裏請注意,指令的方法應該是參數類型。
- factory-method:指定用於創建java bean 工廠的methed方法。在Spring當中,對象的創建最好是通過bean factory來創建。
- factory-bean:指定用於創建java bean實例的工廠類。
接下來介紹bean的子元素:
1.constructor-arg
當我們爲了構建java bean實例的時候,開發者可能需要對java bean來指定構造器的參數。
這與autowire中的constructor是一樣的。當java bean僅存在單個構造器的時候,則可以直接使用。
如下:
在這裏我們定義了一個名稱爲HelloWorld的java bean,他僅存在着一個構造器,而且構造器中只有一個參數,在這裏我們引用的是HelliChina這個bean。
</bean>
<bean name="HelloWorld" class="cn.lovepi.chapter03.instance.HelloWorld">
<constructor-arg>
<ref bean="HelloChina"/>
</constructor-arg>
</bean>
那麼,如果存在多個構造器參數的時候,則開發者能夠通過index或者type來指定構造器參數。
其中:
inex用於指定具體參數在構建器列表當中的位置。
type用於指定具體參數的類型。
那麼接下來看一看constructor-args的內容模型:可以看到他包含兩個屬性index和type,
其中:
inex用於指定具體參數在構建器列表當中的位置。
type用於指定具體參數的類型。
而在右邊是他包含的一些子元素,
可以看到其中還有list、set、map、props這些存儲對象的容器。類似與java Collection中定義的。
那麼接下來詳細的看一看這四個元素的基本內容模型:
List內容元素模型如下:
可以看到,他同樣包含了一些子元素。
接下來,看下set元素的基本內容結構
最後,我們看到的是map元素:
2.Property
爲了構建java bean實例,開發者可能需要爲java bean指定屬性,即藉助其暴露的setter方法,下圖是property其節點的內容模型:
3.lookup-method
接下來給出lookup-method的內容模型圖:
4.Replace-method
Replace-method的內容模型圖: