javascript
Spring学习之Bean的配置
本文將會介紹Spring框架中wiring beans的相關內容,包括:bean的聲明與創建、在xml文件中對bean基本使用方法的配置以及Spring 3中新特性Spring Expression Language(即SpEL)的初步介紹。
在引出bean之前,不得不提到container。Container用于描述包含并維護其他組件(component)的組件。在Spring框架中,提供了兩種Container,即BeanFactory和ApplicationContext。其中,BeanFactory是最簡單的一種Container,能夠提供基本的依賴注入(DI)和wring bean的服務。而當需要使用到更加高級的Spring框架服務,例如Spring AOP、事件傳遞及各種不同應用層的context實現等時,則ApplicationContext能夠顯示出其優勢。而提及bean,則可以簡單地理解為是經過實例化,編譯的對象。它是由container進行管理的。
下面開始詳細介紹bean在Spring中的配置。
以下代碼是一個典型的Spring中beans的xml配置。其中bean的聲明處于<beans></beans>之中。當然,除了beans這個命名空間外,還有例如aop,context,jee,util等更加高級和復雜的命名空間存在,他們和<beans>是同級別的。本文中只關注<beans>命名空間。例如現在存在一個類,它的定義如下:
以下是電影TheStarWar作為Movie的一個實例而被定義為一個Spring bean:
其中,class="com.Spring.demo.Movie"和Java代碼進行關聯,從而根據xml文件中的值進行Movie的實例化,最終結果得到名為Star Wars的實例StarWars。此時,我們便可以使用ApplicationContext對象來使用已經配置過的xml:
另外情況是,Movie的構造函數的一個參數另外一個對象,例如,Movie對象的構造函數多了一個Music類型的參數(背景音樂的需要),則需在xml配置中增加一個構造函數參數:
屬性'ref'代表了一種引用關系。它是另外一個類型為Music,并已于beans內定義的實例。此處,Music類的詳細定義暫且略去。
除此之外,我們知道bean是有一個生命周期的。Spring為其提供了兩個beans的屬性:default-init-method, default-destory-method。它們分別對應類的某個特定方法。
我們知道,在很多時候一個類里面存在setters和getters方法。例如,上述例子中,引入了Music類型的字段之后,可能出現情形:
針對這種情況,Spring提供了與construct-arg平行的標簽:<property>。例如:
當然,此處的ref表示的是引用類型,該類型一再beans中定義。如果是值類型,則可以直接使用value屬性。
Spring還提供了一種內部bean的形式,即在bean的內部定義另外一個bean,以達到使用目的。這種方式和引用方式的區別在于,引用方式所引用的bean被定義在<beans></beans>之中,這種bean可以被所有的其他定義在beans下的bean所共享;而內部bean,只可以由其外層的bean使用,即獨享型的。除此之外,內部bean的使用和定義和一般的bean并無區別。在次,不過不再多闡述。
接下來所說的是Spring對集合類型的裝載。體現在四個集合類型中:<list>、<set>、<map>、<props>。<list>和<set>的區別是,<set>不允許其內部存在冗余數據;<map>和<props>的區別在于,<props>內部的name和value必須都是String類型,而<map>則可以是任何類型。其實,這四種定義在xml文件中的集合類型在被解析時,會構造出相應在java中的集合類型,即java.util.*。下面接著上述的例子進行。一般來講,一部電影會穿插多種音樂。因此,應該將字段music改為集合類型。于是可以設置如下:
類似的,<set>的使用完全一樣,前提是需要保證內部的數據沒有重復。<map>是一組name-value的集合,如果我們List類型換為map類型,則xml中的配置如下:
為了方便起見,現將music設想為Properties類型的。于是<props>的使用如下:
需要注意的是,Spring同時也提供了null的裝載。這是由于有些屬性在未被賦值之前,需要保持為空。舉例如下:
最后要說的當然是SpEL。這一特性在Spring 3中得以引進。它的一般使用方式是:
SpEL在以下的點上提供了便捷方式:通過對bean的ID來引用bean;對對象方法的調用和屬性訪問;提供算術,關系以及邏輯的運算;正則表達式的匹配;對集合的操作。首先,第一點,引用bean:
和
是等價的。但不同的是,我們可以使用如下方式:
即調用對象的方法(或可以訪問對象的屬性值)。這就是上述所說的SpEL的優勢之二。在算術、關系和邏輯運算中,類似于在“#{}”中的括號里編寫Java代碼。拿下例來說:
這是一個簡單的除運算。(有趣的是,SpEL提供了^操作,而Java沒有。)關系運算需要注意的地方是,大于或者小于號和xml的書寫規則會沖突,于是S平EL提供了eq,lt,le,gt,ge分別表示==,<,<=,>,>=。邏輯運算關鍵詞分別有:and,or,not以及!。注意,S平EL并沒有提供“&&”或者“||”符號代表and和or。另外,三木運算方式和Java的書寫方式也是類似的。而對于正則表達式匹配,SpEL提供了matches關鍵字,這里不再過多闡述。
對集合的操作,SpEL提供了類似Java操作集合的機制。下面以一個例子為例:
以下代碼使用Spring的<util:list>定義了一組城市:
此時,我們就可以使用SpEL篩選具體的城市:
與使用<util:list>類似,我們也可以這樣使用<util:map>,通過name來得到value。除了直接使用“.[]”的方式過濾外,還有“.^[]”和“.$[]”兩種方式,分別表示選擇第一個和最后一個匹配的項。最后要說的一個是“.![]”,它用于支持集合的映射。
當只是需要得到城市名,而不需要得到全部的城市信息時,使用以上代碼,可以直接映射之前所定義的城市集合中,各城市的名稱部分信息集合。
需要注意的是,雖然使用SpEL可以減少Java代碼的編寫工作,但是過多的使用會帶來一些負面的影響。這種方式不好編寫測試代碼,同時也沒有IDE的支持,以檢查語法問題。
至此,對bean的基本使用方式已經介紹得差不多了。
轉載于:https://blog.51cto.com/mingzm/1033236
總結
以上是生活随笔為你收集整理的Spring学习之Bean的配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Charset]UTF-8, UTF-
- 下一篇: ORACLE10g安装