1. 程式人生 > >Spring學習(十六)Spring Bean內容模型介紹

Spring學習(十六)Spring Bean內容模型介紹

       本次主要介紹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的內容模型:

可以看到他包含兩個屬性indextype 其中: 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的內容模型圖: