日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring学习之Bean的配置

發(fā)布時(shí)間:2025/3/20 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring学习之Bean的配置 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文將會介紹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è)類,它的定義如下:

  • package?org.Spring.demo;??
  • public?class?Movie?{??
  • ??private?movieName;?
  • ??private introInfo;?
  • ??public?Movie()?{??
  • ??}??
  • ??public?Movie(String?movieName,?String introInfo)?{??
  • ????this.movieName?=?movieName;?
  • ????this.introInfo = introInfo;?
  • ??}?
  • ??public?void display()?{?
  • ????system.out.println(movieName?+?":"?+ introInfo);?
  • ??}?
  • }?

  • 以下是電影TheStarWar作為Movie的一個(gè)實(shí)例而被定義為一個(gè)Spring bean:

  • <?xml?version="1.0"?encoding="UTF-8"??>??
  • <beans?xmlns="http://springframework.org/schmema/beans"??
  • ????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • ????????xsi:schemaLocation="http://www.springframework.org/schema/beans??
  • http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">??
  • ??<bean?id="StarWars"?class="com.Spring.demo.Movie"?>?
  • ????<constructor-arg?value="Star?Wars"?/>?
  • ????<constructor-arg?value="bla?bla?bla?bla"?/>?
  • ??</bean>??
  • </beans>??
  • 其中,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:

  • ApplicationContext?ctx?=?new?ClassPathXmlApplicationContext(??
  • ????????"com/Spring/demo/spring-demo.xml");??
  • Movie?starWars?=?ctx.getBean("StarWars");?
  • starWars.display();?
  • 另外情況是,Movie的構(gòu)造函數(shù)的一個(gè)參數(shù)另外一個(gè)對象,例如,Movie對象的構(gòu)造函數(shù)多了一個(gè)Music類型的參數(shù)(背景音樂的需要),則需在xml配置中增加一個(gè)構(gòu)造函數(shù)參數(shù):

  • <constructor-arg?ref="ANewHopeandEndCredits">?
  • 屬性'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)情形:

  • private?Music?music?;?
  • ??public?void?setMusic(Music?music)?{?
  • ????this.music?=?music;?
  • }?
  • ??public?Music?getMusic()?{?
  • ????return?music;?
  • }?
  • 針對這種情況,Spring提供了與construct-arg平行的標(biāo)簽:<property>。例如:

  • <property?name="music" ref="ANewHopeandEndCredits"?/>?
  • 當(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è)置如下:

  • <property?name="music">??
  • ??<list>??
  • ????<ref?bean="EnterLordVader"?/>??
  • ????<ref?bean="ANewHopeandEndCredits"?/>??
  • ????<!--?<ref?bean=""?/>-->??
  • ??</list>??
  • </property>??
  • 類似的,<set>的使用完全一樣,前提是需要保證內(nèi)部的數(shù)據(jù)沒有重復(fù)。<map>是一組name-value的集合,如果我們List類型換為map類型,則xml中的配置如下:

  • <property?name="music">???
  • ??<map>???
  • ????<entry?key="Enter?Lord?Vader"?value="EnterLordVader"?/>???
  • ????<entry?key="A?New?Hope?and?End?Credits"?value="ANewHopeandEndCredits"?/>???
  • ??</map>???
  • </property>??
  • 為了方便起見,現(xiàn)將music設(shè)想為Properties類型的。于是<props>的使用如下:

  • <property?name="music">?
  • ????<props>?
  • ??????<prop?key="EnterLordVade">Enter?Lord?Vade</prop>?
  • ??????<prop?key="ANewHopeandEndCredits">A?New?Hope?and?End?Credits</prop>?
  • ????</props>?
  • ??</property>?
  • 需要注意的是,Spring同時(shí)也提供了null的裝載。這是由于有些屬性在未被賦值之前,需要保持為空。舉例如下:

  • <property?name="someNonNullProperty"><null/></property>?
  • 最后要說的當(dāng)然是SpEL。這一特性在Spring 3中得以引進(jìn)。它的一般使用方式是:

  • <property?name="count"?value="#{5}"/>?
  • SpEL在以下的點(diǎn)上提供了便捷方式:通過對bean的ID來引用bean;對對象方法的調(diào)用和屬性訪問;提供算術(shù),關(guān)系以及邏輯的運(yùn)算;正則表達(dá)式的匹配;對集合的操作。首先,第一點(diǎn),引用bean:

  • <property?name="ANewHopeandEndCredits"?value="#{ANewHopeandEndCredits}"/>?
  • <property?name="ANewHopeandEndCredits"?ref="ANewHopeandEndCredits">?
  • 是等價(jià)的。但不同的是,我們可以使用如下方式:

  • <property?name="ANewHopeandEndCredits"?value="#{ANewHopeandEndCredits.getName()}"/>??
  • 即調(diào)用對象的方法(或可以訪問對象的屬性值)。這就是上述所說的SpEL的優(yōu)勢之二。在算術(shù)、關(guān)系和邏輯運(yùn)算中,類似于在“#{}”中的括號里編寫Java代碼。拿下例來說:

  • <property?name="average"?value="#{counter.total?/?counter.count}"/>?
  • 這是一個(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è)例子為例:

  • package?com.Spring.cities;?
  • public?class?City?{?
  • ??private?String?name;?
  • ??private?String?province;?
  • ??public?String?getName()?{?
  • ????return?this.name;?
  • ??}?
  • ??public?String?getProvince()?{?
  • ????return?this.province;?
  • ??}?
  • ??public?void?setName(String?name)?{?
  • ????this.name?=?name;?
  • ??}?
  • ??public?void?setProvince(String?province)?{?
  • ????this.province?=?province;?
  • ??}?
  • }?
  • 以下代碼使用Spring的<util:list>定義了一組城市:

  • <util:list?id="cities">?
  • ??<bean?class="com.Spring.cities.City"?
  • ?????p:name="Chengdu"?p:province="Sichuan"?/>?
  • ??<bean?class="com.Spring.cities.City"?
  • ?????p:name="Guangzhou"?p:province="Guangdong"?/>?
  • ??<bean?class="com.Spring.cities.City"?
  • ?????p:name="Xian"?p:province="Shanxi"?/>?
  • ??<bean?class="com.Spring.cities.City"?
  • ?????p:name="Yinchuan"?p:province="Ningxia"?/>?
  • </util:list>?
  • 此時(shí),我們就可以使用SpEL篩選具體的城市:

  • <property?name="chosenCity"?value="#{cities[2]}"/>?
  • 與使用<util:list>類似,我們也可以這樣使用<util:map>,通過name來得到value。除了直接使用“.[]”的方式過濾外,還有“.^[]”和“.$[]”兩種方式,分別表示選擇第一個(gè)和最后一個(gè)匹配的項(xiàng)。最后要說的一個(gè)是“.![]”,它用于支持集合的映射。

  • <property?name="cityNames"?value="#{cities.![name]}"/>?
  • 當(dāng)只是需要得到城市名,而不需要得到全部的城市信息時(shí),使用以上代碼,可以直接映射之前所定義的城市集合中,各城市的名稱部分信息集合。

    需要注意的是,雖然使用SpEL可以減少Java代碼的編寫工作,但是過多的使用會帶來一些負(fù)面的影響。這種方式不好編寫測試代碼,同時(shí)也沒有IDE的支持,以檢查語法問題。

    至此,對bean的基本使用方式已經(jīng)介紹得差不多了。

    轉(zhuǎn)載于:https://blog.51cto.com/mingzm/1033236

    總結(jié)

    以上是生活随笔為你收集整理的Spring学习之Bean的配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。