Spring 裝配Bean

普通裝配方式

聲明Bean

public class User {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(int age) {
        this.age = age;
    }

    public void sayAge(){
        System.out.println("age->" + age);
    }
}

通過構(gòu)造器注入

springTest.xml 中配置:

<bean id="duke" class="類的完全限定名">
  <constructor-arg value="15">
  <!--如果需要傳入引用對象-->
  <constructor-arg ref="引用對象在xml中的id"
</bean>

main 方法中配置:

ApplicationContext ctx = new ClassPathXmlApplicationContext("springTest.xml");
        User user = (User) ctx.getBean("tom");
        user.sayAge();

Bean的作用域

如果我們需要讓Spring在每次請求時都為Bean產(chǎn)生一個新實例,需要配置Bean的scope

<bean id="ticket" class="..." scope="prototype" />

Spring還提供了其他幾個作用域選項:

  1. singleton: 在每一個Spring容器中按价,一個Bean定義只有一個對象示例(默認(rèn))
  2. prototype: 允許Bean的定義可以被實例化任意次(每次調(diào)用都創(chuàng)建一個示例)
  3. request: 在一次HTTP請求中,每個Bean定義對應(yīng)一個實例恋拍,該作用域僅在基于Web的Spring上下文(例如Spring MVC)中才有效
  4. session: 在一次HTTP Session中刃宵,每個Bean定義對應(yīng)一個實例什湘,該作用域僅在基于Web的Spring上下文(例如Spring MVC)中才有效
  5. global-session: 在一個全局HTTP Session中暑脆,每個Bean定義對應(yīng)一個實例箱亿,該作用域僅在基于Web的Spring上下文(例如Spring MVC)中才有效

初始化和銷毀Bean

<bean id="..." class="..."
    init-method="初始化后方法名"
    destory-method="銷毀前調(diào)用的方法"
/>

還可以配置默認(rèn)的init-method和destory-method:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/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.xsd">

       default-init-method="默認(rèn)初始化方法"
       default-default-method="默認(rèn)銷毀前調(diào)用的方法"


</beans>

注入Bean屬性

Bean的聲明:

public class User {

    private String name;
    private int age;

    public User() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(int age) {
        this.age = age;
    }

    public void sayAge(){
        System.out.println("age->" + age);
    }

    public void sayName() {
        System.out.println("name->" + name);
    }
}

xml中的配置:

<bean id="jack" class="User">
        <constructor-arg value="19"/>
        <property name="name" value="Jack" />
        <!--如果需要引用其他對象-->
        <property name="..." ref="..." />
</bean>

使用Spring的命名空間p裝配屬性

在xml的根標(biāo)簽beans加上以下聲明:

xmlns:p="http://www.springframework.org/schema/p"

使用方式:

<bean id="jack" class="User"
  p:name = "Jack"
  <!--如果需要屬性為引用對象-->
  p:poem-ref = "poem"
/>


裝配集合

Java中共有4中數(shù)據(jù)集合,分別是:

  • List: 裝配list類型的值只壳,允許重復(fù)
  • Set: 裝配set類型的值俏拱,不允許重復(fù)
  • Map: 裝配map類型的值,名稱和值可以是任意類型
  • pros: 裝配properties類型的值,名稱和值必須是String類型

以下是裝配 List,Set,Array 的例子

<bean id="libai" class="User">
        <property name="poems">
            <list>

                <ref bean="tangshi" />
                <ref bean="songci" />
                <ref bean="yuanqu" />

            </list>
        </property>
</bean>

以下是裝配 Map 的例子

<bean id="libai" class="User">
        <property name="poems">
            <map>
                <entry key="tangshi" value-ref="tangshi" />
                <entry key="songci" value-ref="songci" />
                <entry key="yuanqu" value-ref="yuanqu"/>
            </map>
        </property>
</bean>

以下是裝配 properties 的例子


<bean id="libai" class="User">
    <property name="poems">
        <props>
            <prop key="tangshi">唐詩三百首</prop>
            <prop key="songci">宋詞五百首</prop>
            <prop key="yuanqu">元曲一千首</prop>
        </props>
    </property>
    <!--設(shè)定某屬性為空-->
    <property name="someThingNull"><null/></property>  
</bean>

使用SpEL表達式裝配

字面值

<!--整形-->
<property name="count" value="#{5}" />
<!--混用-->
<property name="message" value="This count is #{5}"/>
<!--浮點型-->
<property name="floatNum" value="#{89.7}"/>
<!--科學(xué)計數(shù)法-->
<property name="longNum" value="#{1e4}"/>
<!--字符串-->
<property name="str" value="#{'String'}"/>
<!--布爾型-->
<property name="enabled" value="#{false}"/>

引用Bean吼句,properties和方法

<!--引用Bean-->
<property name="BeanID" value="#{Bean}"/>
<!--等同于-->
<property name="BeanID" ref="Bean"/>

<!--引用方法-->
<property name="song" value="#{songSelector.selectSong()}"/>

<!--將返回值全部轉(zhuǎn)換為大寫-->
<property name="song" value="#{songSelector.selectSong().toUpperCase()}"/>
<!--避免NullPointerException異常-->
<property name="song" value="#{songSelector.selectSong()?.toUpperCase}"/>

操作類

在SpEL中锅必,使用 T() 運算符會調(diào)用類的作用域的方法和常量

<!--調(diào)用常量-->
<property name="PI" value="#{T(java.lang.Math).PI}"/>
<!--調(diào)用方法-->
<property name="randomNum" value="#{T(java.lang.Math).random()}"/>

在SpEL上執(zhí)行操作

<property name="arithmetic" value="#{counter.total + 43}"/>
<property name="arithmetic" value="#{counter.total - 43}"/>
<property name="arithmetic" value="#{2 * T(java.lang.Math).PI}"/>
<property name="arithmetic" value="#{counter.total / counter.count}"/>
<property name="arithmetic" value="#{counter.total % 20}"/>
<!--SpEL還提供了平方運算-->
<property name="arithmetic" value="#{T(java.lang.Math).PI ^ 2}"/>
<!--執(zhí)行字符串鏈接-->
<property name="str" value="user.firstName + ' ' + user.lastName"/>

<!--比較值-->
<property name="equal" value="#{counter.total == 1000}"/>
<!--大于等于和小于等于在XML中有特殊含義,SpEL表達式提供了語義化的表達式-->
<!--小于等于-->
<property name="equal" value="#{counter.total le 1000}"/>
<!--大于等于-->
<property name="equal" value="#{counter.total ge 1000}"/>

邏輯表達式

  1. and
  2. or
  3. not或!

條件表達式

與Java中的三目運算符相同

正則表達式

運算符號 : matches

訪問集合成員

<!--提取集合中的元素-->
<property name="city" value="#{cities[2]}"/>
<!--隨機提取元素-->
<property name="city" value="#{cities[T(java.lang.Math).randow() * cities.size()]}"/>
<!--獲取Map中的成員-->
<property name="city" value="#{cities['beijing']}"/>

篩選集合成員

<!--篩選人數(shù)大于等于10萬的城市集合-->
<property name="bigCities" value="#{cities.?[population gt 100000]}"/>
<!--篩選第一個符合條件的集合-->
<property name="bigCities" value="#{cities.^[population gt 100000]}"/>
<!--篩選最后一個符合條件的集合-->
<property name="bigCities" value="#{cities.$[population gt 100000]}"/>

投影集合

集合投影是從集合的每一個成員中選擇特定的屬性放入一個新的集合中惕艳。
例如我們僅僅需要包含城市名稱的一個String類型集合搞隐,而不是City對象集合,就需要如下操作

<property name="cityName" value="#{cities.![name]}"/>

如果需要得到城市名字和國家名稱的集合,比如返回"Beijing,China","NewYork,America"這樣的結(jié)果

<property name="cityName" value="#{cities.![name + ',' + state]}"/>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末远搪,一起剝皮案震驚了整個濱河市劣纲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谁鳍,老刑警劉巖癞季,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異倘潜,居然都是意外死亡绷柒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門涮因,熙熙樓的掌柜王于貴愁眉苦臉地迎上來废睦,“玉大人,你說我怎么就攤上這事养泡∈扰龋” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵澜掩,是天一觀的道長购披。 經(jīng)常有香客問我,道長肩榕,這世上最難降的妖魔是什么今瀑? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮点把,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屿附。我一直安慰自己郎逃,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布挺份。 她就那樣靜靜地躺著褒翰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上优训,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天朵你,我揣著相機與錄音,去河邊找鬼揣非。 笑死抡医,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的早敬。 我是一名探鬼主播忌傻,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搞监!你這毒婦竟也來了水孩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤琐驴,失蹤者是張志新(化名)和其女友劉穎俘种,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绝淡,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡宙刘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了够委。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荐类。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茁帽,靈堂內(nèi)的尸體忽然破棺而出玉罐,到底是詐尸還是另有隱情,我是刑警寧澤潘拨,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布吊输,位于F島的核電站,受9級特大地震影響铁追,放射性物質(zhì)發(fā)生泄漏季蚂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一琅束、第九天 我趴在偏房一處隱蔽的房頂上張望扭屁。 院中可真熱鬧,春花似錦涩禀、人聲如沸料滥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葵腹。三九已至高每,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間践宴,已是汗流浹背鲸匿。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阻肩,地道東北人带欢。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像磺浙,于是被迫代替她去往敵國和親洪囤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理撕氧,服務(wù)發(fā)現(xiàn)瘤缩,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • 文章作者:Tyan博客:noahsnail.com 3.4 依賴 標(biāo)準(zhǔn)企業(yè)應(yīng)用不會由一個對象(或Spring用語中...
    SnailTyan閱讀 1,172評論 0 1
  • Spring容器負(fù)責(zé)創(chuàng)建應(yīng)用程序中的bean并通過DI來協(xié)調(diào)這些對象之間的關(guān)系伦泥,我們需要做的就是告訴Spring要...
    xdoyf閱讀 491評論 0 1
  • 月圓是想念剥啤、是思念、是祈盼不脯、是幸福府怯、是團圓。沒有昂貴的月餅給大家防楷,只是以文表達思與念牺丙,愿各自安好,千里共嬋娟复局。 中...
    小小sha閱讀 259評論 0 2