Spring5基礎(chǔ)(3)——Spring Bean(配置屬性+實(shí)例化+作用域)

此博客為學(xué)習(xí)筆記,記錄下來怕自己后面學(xué)著學(xué)著忘記了狡恬。
CSDN內(nèi)容同步更新籽孙,id同名脚牍,本文CSDN鏈接

Spring Bean

Spring5基礎(chǔ)(2)——Spring IoC控制反轉(zhuǎn)(基礎(chǔ))

在上一篇文章中講述到Spring IoC容器創(chuàng)建實(shí)例對象溜嗜,淺顯的在xml文件中配置了需要注入的實(shí)例對象。

更具體一步來說應(yīng)該是Spring IoC容器可以創(chuàng)建架谎,裝配和配置應(yīng)用組件對象(該對象稱為Bean)炸宵,這篇文章將從配置屬性+實(shí)例化+作用域3個(gè)方面詳解Bean。下一篇文章再記錄Bean的生命周期與裝配方式谷扣。

Spring Bean的配置——<bean>元素常用屬性及其子元素

在上篇文章中也有過在xml中對bean的基本配置土全,下列是bean元素常用屬性及其子元素:

  • 屬性
    id:Bean在BeanFactory中唯一標(biāo)識,使用BeanFactory獲取實(shí)例時(shí)以此為索引名会涎,.getBean()方法時(shí)傳入id裹匙。
    class:具體實(shí)現(xiàn)類,如com.lipiao.demo.B
    scope:指定Bean的作用域末秃,本文后面會提到概页。

  • 子元素名稱
    < constructor-arg > :使用構(gòu)造方法注入Bean,還可指定構(gòu)造方法參數(shù)练慕。該元素下的index屬性表示參數(shù)序號惰匙,ref屬性表示對BeanFactory中其他Bean的引用關(guān)系,type屬性表示參數(shù)類型铃将,value屬性表示參數(shù)的常量值项鬼。
    < property > :用于設(shè)置Bean的一個(gè)屬性。該元素下的name屬性用于指定設(shè)置該Bean哪個(gè)屬性劲阎,填入對應(yīng)屬性名稱绘盟。value屬性即指定屬性的屬性值。ref屬性表示對BeanFactory中其他Bean的引用關(guān)系悯仙。
    < list > :用于封裝List或數(shù)組類型的依賴注入龄毡。
    < map > :用于封裝Map類型的依賴注入。
    < set > :用于封裝Set類型的依賴注入锡垄。
    < enty > :用于設(shè)置一個(gè)鍵值對稚虎。
    < list >、< map >偎捎、< set >蠢终、< enty >這四個(gè)子元素會在下一篇文章記錄Bean裝配方式中會提到:

了解完屬性之后再回過頭去看上篇文章在xml文件的配置信息就一目了然啦序攘。
舉個(gè)栗子:

package com.lipiao.demo;
public class A {
    String name;
    public void setName(String name) {
        this.name = name;
    }
}

在applicationContext.xml中配置該類如下所示:

<bean id="A4_1" class="com.lipiao.demo.A">
        <property name="name" value="A4_1"></property>
</bean>

這里就是對com.lipiao.demo.A這個(gè)類(class)進(jìn)行配置,設(shè)置唯一標(biāo)識符(id)為A4_1寻拂。使用bean的子元素property為該類設(shè)置一個(gè)屬性程奠,設(shè)置的屬性名稱(name)為name,設(shè)置的屬性值(value)為A4_1.

我們在使用Bean的時(shí)候就可以通過配置信息中的唯一標(biāo)識符(id)獲取該實(shí)例對象啦祭钉,使用getBean方法傳入id瞄沙,如下所示:

//4.1 ClassPathXmlApplicationContext 使用相對路徑(resources根目錄)
        ApplicationContext applicationContext4_1 =
                new ClassPathXmlApplicationContext("META-INF/applicationContext.xml");
        A a4_1= (A) applicationContext4_1.getBean("A4_1");

Spring Bean的實(shí)例化——構(gòu)造方法,靜態(tài)工廠慌核,實(shí)例工廠

  • 構(gòu)造方法實(shí)例化
    Spring容器可以調(diào)用Bean對應(yīng)類中的無參構(gòu)造方法來實(shí)例化Bean距境,這就是構(gòu)造方法實(shí)例化。
    其實(shí)剛剛使用A類的時(shí)候就是通過無參構(gòu)造實(shí)例化(不寫構(gòu)造默認(rèn)會有一個(gè)無參構(gòu)造)垮卓,就不重復(fù)舉例了垫桂。

修改A類代碼如下,刪掉set粟按,添加一個(gè)有參構(gòu)造方法诬滩,補(bǔ)上無參構(gòu)造,接下來的兩個(gè)實(shí)例化Bean方法基于此A類

package com.lipiao.demo;
public class A {
    String name;
    public A() {
    }
    public A(String name) {
        this.name = name;
    }
}
  • 靜態(tài)工廠實(shí)例化
    ①創(chuàng)建工廠類BeanStaticFactory
    在工廠類中創(chuàng)建一個(gè)靜態(tài)方法來創(chuàng)建Bean的實(shí)例
package com.lipiao.demo;

public class BeanStaticFactory {
    private static A a=new A("靜態(tài)工廠實(shí)例化");
    public static A createA(){
        return a;
    }
}

②applicationContext.xml總添加配置信息

<!--    靜態(tài)工廠實(shí)例化-->
    <bean id="staticFactory"
          class="com.lipiao.demo.BeanStaticFactory"
          factory-method="createA"></bean>

其中factory-method屬性即調(diào)用工廠類中的方法灭将,例子中時(shí)調(diào)用createA();
③獲取該實(shí)例化Bean

//Spring Bean  2.靜態(tài)工廠實(shí)例化
        ApplicationContext applicationContext5_2 =
                new ClassPathXmlApplicationContext("META-INF/applicationContext.xml");
        A a5_2= (A) applicationContext5_2.getBean("staticFactory");
        System.out.println(a5_2.name);

運(yùn)行效果:

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@23ab930d: startup date [Thu Jul 18 23:33:13 CST 2019]; root of context hierarchy
七月 18, 2019 11:33:14 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [META-INF/applicationContext.xml]
靜態(tài)工廠實(shí)例化
  • 實(shí)例工廠實(shí)例化
    ①創(chuàng)建工廠類BeanInstanceFactory
    在工廠類中創(chuàng)建一個(gè)實(shí)例方法來創(chuàng)建Bean的實(shí)例
package com.lipiao.demo;
public class BeanInstanceFactory {
    public A createA() {
        return new A("實(shí)例工廠實(shí)例化");
    }
}

②applicationContext.xml總添加配置信息
首先配置實(shí)例工廠類疼鸟,之后使用factory-bean屬性配置指定的配置工廠,factory-method屬性指定實(shí)例工廠中的實(shí)例方法庙曙。

    <!--    實(shí)例工廠實(shí)例化-->
    <!--    配置工廠-->
    <bean id="myFactory" class="com.lipiao.demo.BeanInstanceFactory"/>
    <bean id="instanceFactory" factory-bean="myFactory" factory-method="createA"/>

③獲取該實(shí)例化Bean

//Spring Bean  3.實(shí)例工廠實(shí)例化
        ApplicationContext applicationContext5_3 =
                new ClassPathXmlApplicationContext("META-INF/applicationContext.xml");
        A a5_3= (A) applicationContext5_3.getBean("instanceFactory");
        System.out.println(a5_3.name);

運(yùn)行效果:

七月 18, 2019 11:49:30 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4566e5bd: startup date [Thu Jul 18 23:49:30 CST 2019]; root of context hierarchy
七月 18, 2019 11:49:30 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [META-INF/applicationContext.xml]
實(shí)例工廠實(shí)例化

Spring Bean的作用域

完成實(shí)例化Bean之后空镜,還可以指定Bean的作用域。
一共六種捌朴,前兩者常用姑裂,后四種僅在Web Spring應(yīng)用程序上下文中使用。

  • singleton:這是默認(rèn)的作用域男旗,Spring容器中只有一個(gè)Bean實(shí)例舶斧,即容器內(nèi)為單例模式。
  • prototype:Spring容器每次獲取該作用域的Bean實(shí)例時(shí)察皇,都會新建一個(gè)Bean實(shí)例茴厉。
  • request:在一次HTTP請求中將返回一個(gè)Bean實(shí)例,不同的HTTP請求返回不同實(shí)例什荣。
  • session:在一次HTTP session中返回一個(gè)Bean實(shí)例矾缓。
  • application:為每個(gè)ServletContext對象創(chuàng)建實(shí)例,即同一應(yīng)用共享一個(gè)Bean實(shí)例稻爬。
  • websocket:為每個(gè)websocket對象創(chuàng)建實(shí)例嗜闻。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桅锄,隨后出現(xiàn)的幾起案子琉雳,更是在濱河造成了極大的恐慌样眠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翠肘,死亡現(xiàn)場離奇詭異檐束,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)束倍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門被丧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绪妹,你說我怎么就攤上這事甥桂。” “怎么了邮旷?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵黄选,是天一觀的道長。 經(jīng)常有香客問我廊移,道長糕簿,這世上最難降的妖魔是什么探入? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任狡孔,我火速辦了婚禮,結(jié)果婚禮上蜂嗽,老公的妹妹穿的比我還像新娘苗膝。我一直安慰自己,他們只是感情好植旧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布辱揭。 她就那樣靜靜地躺著,像睡著了一般病附。 火紅的嫁衣襯著肌膚如雪问窃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天完沪,我揣著相機(jī)與錄音域庇,去河邊找鬼。 笑死覆积,一個(gè)胖子當(dāng)著我的面吹牛听皿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宽档,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼尉姨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吗冤?” 一聲冷哼從身側(cè)響起又厉,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤九府,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后馋没,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昔逗,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年篷朵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勾怒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡声旺,死狀恐怖笔链,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腮猖,我是刑警寧澤鉴扫,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站澈缺,受9級特大地震影響坪创,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姐赡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一莱预、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧项滑,春花似錦依沮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至州疾,卻和暖如春辜限,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背严蓖。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工薄嫡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谈飒。 一個(gè)月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓岂座,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杭措。 傳聞我的和親對象是個(gè)殘疾皇子费什,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評論 2 361

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

  • 本來是準(zhǔn)備看一看Spring源碼的。然后在知乎上看到來一個(gè)帖子,說有一群**自己連Spring官方文檔都沒有完全讀...
    此魚不得水閱讀 6,938評論 4 21
  • Spring入門使用Spring容器Spring容器使用ApplicationContextApplication...
    漸丶忘閱讀 1,410評論 0 4
  • 2.1 我們的理念是:讓別人為你服務(wù) IoC是隨著近年來輕量級容器(Lightweight Container)的...
    好好學(xué)習(xí)Sun閱讀 2,717評論 0 11
  • 參考W3C Spring教程 Spring致力于J2EE應(yīng)用的各種解決方案鸳址,而不僅僅專注于某一層解決方案瘩蚪。可以說S...
    王偵閱讀 1,172評論 0 6
  • 實(shí)現(xiàn)效果: 有固定寬高: 方法1:設(shè)置盒子position為absolute稿黍,注意設(shè)置父元素position為re...
    飛飛廉閱讀 298評論 0 2