(FS計劃)Spring的IoC容器對bean的實例化

首先胰丁,加載bean需要先寫好配置文件(其實用注解也可以,只是不方便理解)

配置

<beans>
    <!--導(dǎo)入其他資源XML-->
    <import resource=”resource1.xml”/>
    <!--Bean定義曲尸,class定義Bean的實現(xiàn)類雀费,id稱為標(biāo)識符,其余id為別名-->
    <bean id=”bean1”class=””></bean>
    <bean id=”bean2”class=””></bean>
<!--指定name忿磅,這樣name就是“標(biāo)識符”-->
<bean name=”bean2”class=””></bean>
    <!--alias為bean指定別名-->
    <alias alias="bean3" name="bean2"/>
    <!--導(dǎo)入其他依賴-->
    <import resource=”resource2.xml”/>
</beans>

多個配置文件是可以編制成數(shù)組糯彬,交給ApplicationContext加載的。
但是大家現(xiàn)在用習(xí)慣了注解

SpringMVC的IoC容器中葱她,管理的bean 內(nèi)部表示為BeanDefinition

一個bean需要以下屬性

  • 全限定類名(FQN):用于定義Bean的實現(xiàn)類;
  • Bean行為定義:這些定義了Bean在容器中的行為撩扒;包括作用域(單例、原型創(chuàng)建)吨些、是否惰性初始化及生命周期等搓谆;
  • Bean創(chuàng)建方式定義:說明是通過構(gòu)造器還是工廠方法創(chuàng)建Bean;
  • Bean之間關(guān)系定義:即對其他bean的引用豪墅,也就是依賴關(guān)系定義泉手,這些引用bean也可以稱之為同事bean 或依賴bean,也就是依賴注入但校。

bean使用時必須有一個唯一的指定:
id必須唯一不可重復(fù)螃诅,一個bean可以有多個id,其余的id是別名状囱;
沒有id可以用唯一不重復(fù)的name术裸,若有需要可以使用alias來指定別名,或者用,隔開亭枷;
同時指定id和name袭艺,id就是標(biāo)識符,而name就是別名叨粘,總之必須在IoC容器中唯一猾编;
若id和name都沒有指定,則bean在使用的時候會使用全限定的類名進(jìn)行注入升敲。

實例化

SpringMVC是通過反射來實例化bean的答倡。
1.通過構(gòu)造器實例化bean:
Spring IoC容器即能使用默認(rèn)空構(gòu)造器也能使用有參數(shù)構(gòu)造器兩種方式創(chuàng)建Bean,無參數(shù)的直接在XML文件中直接定義bean節(jié)點驴党,帶參數(shù)的可以在XML文件中bean節(jié)點下增加constructor-arg參數(shù)屬性:

<bean name="test" class="com.zing.test.HelloMvc">
<!-- 指定構(gòu)造器參數(shù) -->
    <constructor-arg index="0" value="第一個參數(shù)"/>
</bean>

index是參數(shù)所在的位置瘪撇,value表示注入常量值,也可以指定引用,指定引用使用ref來引用另一個Bean定義倔既,當(dāng)然注入還可以根據(jù)參數(shù)類型和名字來配置

<!-- 根據(jù)變量名注入 -->
    <constructor-arg name="testIoC" value="第一個參數(shù)"/>
<!-- 根據(jù)參數(shù)類型注入-->
    <constructor-arg type="java.lang.String" value="第一個參數(shù)"/>
<!--構(gòu)造器里注入另一個bean-->
<!-- 通過構(gòu)造器注入 -->
<bean id="helloApi" class="com.zing.test.NormalBean"/>
<bean id="bean2" class="com.zing.test.TestProperty">
    <property name="helloApi"><ref bean=" helloApi"/></property>
</bean>

2.使用靜態(tài)工廠來實例化bean
需要編寫工廠方法恕曲,這樣實例化的時候即可使用工廠方法來實例化bean

package com.zing.test.factory_test;

import com.zing.test.hello.HelloImpl;
//工廠類
public class HelloIoCFactory {
    public static HelloImpl newInstance(String name) {
        System.out.println(name);
        return new HelloImpl(name);
    }
}

第一種工廠配置

<!--為bean配置工廠方法-->
<bean class="com.zing.test.factory_test.HelloIoCFactory" id="helloIoC" factory-method="newInstance">
    <constructor-arg index="0" value="哈哈"/>
</bean>

第二種工廠配置

<bean id="instanceFactory" class="com.zing.test.factory_test.HelloIoCFactory"/>
<bean id="byIndex" factory-bean="instanceFactory"  factory-method="newInstance">
    <constructor-arg index="0" value="Hello World!"/>
    <constructor-arg index="1" value="1"/>
</bean>
//通過工廠獲取實例
BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring-config.xml");
HelloInterface hello = beanFactory.getBean("helloIoC",HelloImpl.class);
hello.sayHello();

3.通過setter方法進(jìn)行注入
個人覺得:有必要嗎?都是用注解的好不好渤涌,就列一下佩谣,不詳細(xì)記錄了

<!-- 通過setter方式進(jìn)行依賴注入 -->
    <bean id="bean" class="com.zing.test.factory_test.HelloImpl4">
        <property name="message" value="Hello World!"/>
        <property name="index">
            <value>1</value>
        </property>
    </bean>

4.延時實例化
延時初始化又叫惰性初始化,作用是消除資源占用巨大的bean在程序初始化時的影響实蓬,防止因為這個bean茸俭,導(dǎo)致啟動緩慢。延遲初始化的Bean通常會在第一次使用時被初始化瞳秽;
配置如下:

<!-- 通過配置lazy-init="true"實現(xiàn)惰性初始化 -->
<bean id="helloApi" class="com.zing.test.HelloImpl" lazy-init="true"/>

自動裝配

自動裝配就是指由Spring來自動地注入依賴對象瓣履,無需人工參與率翅。

目前Spring3.0支持no练俐、byNamebyType冕臭、constructor四種自動裝配腺晾,默認(rèn)是“no”指不支持自動裝配的,其中Spring3.0已不推薦使用之前版本的autodetect自動裝配辜贵,推薦使用Java 5+支持的(@Autowired)注解方式代替悯蝉;

<bean id="helloApi" class="com.zing.test.HelloImpl"/>
<bean id="bean" class="com.zing.test.bean.HelloApiDecorator" autowire="byName"/>
  • byName使用setter方法根據(jù)參數(shù)名稱注入
  • 根據(jù)類型注入,在根據(jù)類型注入時托慨,將把當(dāng)前自己排除在外鼻由!如果是ListMap這樣的類型厚棵,用autowire-candidate屬性為false來讓指定的Bean放棄作為自動裝配的候選者蕉世。使用primary屬性為true來指定某個Bean為首選Bean
  • constructor構(gòu)造器注入,只用在構(gòu)造器中婆硬。
  • autodetect自動匹配狠轻,不推薦使用!

不是所有的類型都支持自動匹配彬犯,Object向楼、基本數(shù)據(jù)類型(Date、CharSequence谐区、Number湖蜕、URI、URL宋列、Class昭抒、int不支持
<bean>標(biāo)簽的autowire-candidate屬性可被設(shè)為false,這個bean將不能作為可依賴注入的參數(shù)
數(shù)組類型、集合(Set戈鲁、Collection仇参、List)接口類型:將根據(jù)泛型獲取匹配的所有候選者并注入到數(shù)組或集合中
字典(Map)接口類型:同樣根據(jù)泛型信息注入,鍵必須為String類型的Bean名字婆殿,值根據(jù)泛型信息獲取

缺點

如果你用的是自動裝配的話诈乒,出了問題會比較難找。不知道是哪里注入進(jìn)來的婆芦,唉怕磨,這就是我等菜比為什么要先從配置開始看。現(xiàn)在流行用注解消约,會好不少肠鲫。

依賴檢查

用于檢查Bean定義的屬性都注入數(shù)據(jù)了,不管是自動裝配的還是配置方式注入的都能檢查或粮,如果沒有注入數(shù)據(jù)將報錯导饲,從而提前發(fā)現(xiàn)注入錯誤,只檢查具有setter方法的屬性氯材。
對于注解來說沒什么用渣锦,簡單介紹一下

<bean id="test"/>
<!-- 注意我們沒有注入,所以測試時會報錯 -->
<bean id="bean" dependency-check="objects">
  <property name="message" value="Haha"/>
</bean>

dependency-check配置檢查類型氢哮,一共有4種:null袋毙,object,simple冗尤,all
null=不檢查听盖,為默認(rèn)配置。
object=檢查除基本類型外的依賴對象裂七。
simple=對基本類型進(jìn)行依賴檢查皆看,包括數(shù)組類型,其他依賴不報錯碍讯;
all=所有類型都檢查


FS全棧計劃目錄:https://micorochio.github.io/fs-plan/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悬蔽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捉兴,更是在濱河造成了極大的恐慌蝎困,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倍啥,死亡現(xiàn)場離奇詭異禾乘,居然都是意外死亡,警方通過查閱死者的電腦和手機虽缕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門始藕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事伍派〗” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵诉植,是天一觀的道長祥国。 經(jīng)常有香客問我,道長晾腔,這世上最難降的妖魔是什么舌稀? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮灼擂,結(jié)果婚禮上壁查,老公的妹妹穿的比我還像新娘。我一直安慰自己剔应,他們只是感情好睡腿,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著领斥,像睡著了一般嫉到。 火紅的嫁衣襯著肌膚如雪沃暗。 梳的紋絲不亂的頭發(fā)上月洛,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音孽锥,去河邊找鬼嚼黔。 笑死,一個胖子當(dāng)著我的面吹牛惜辑,可吹牛的內(nèi)容都是我干的唬涧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼盛撑,長吁一口氣:“原來是場噩夢啊……” “哼碎节!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抵卫,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤狮荔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后介粘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殖氏,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年姻采,在試婚紗的時候發(fā)現(xiàn)自己被綠了雅采。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖婚瓜,靈堂內(nèi)的尸體忽然破棺而出宝鼓,到底是詐尸還是另有隱情,我是刑警寧澤巴刻,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布席函,位于F島的核電站,受9級特大地震影響冈涧,放射性物質(zhì)發(fā)生泄漏茂附。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一督弓、第九天 我趴在偏房一處隱蔽的房頂上張望营曼。 院中可真熱鬧,春花似錦愚隧、人聲如沸蒂阱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽录煤。三九已至,卻和暖如春荞胡,著一層夾襖步出監(jiān)牢的瞬間妈踊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工泪漂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廊营,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓萝勤,卻偏偏與公主長得像露筒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子敌卓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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