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