spring詳解(四)

容器中的工廠Bean

此處的工廠Bean與前面介紹的實例工廠方法創(chuàng)建Bean、靜態(tài)工廠創(chuàng)建Bean有所區(qū)別:

前面的那些工廠是標準的工廠模式游岳,Spring只是負責(zé)調(diào)用工廠方法來創(chuàng)建Bean實例块攒;

此處工廠Bean是Spring的一種特殊Bean硬猫,這種工廠Bean必須實現(xiàn)FactoryBean接口。

FactoryBean接口是工廠Bean標準的工廠Bean的接口曲初,實現(xiàn)該接口的Bean只能當工廠Bean使用卒蘸,當我們將工廠Bean部署在容器中雌隅,并通過getBean()方法來獲取工廠Bean,容器不會返回FactoryBean實例而是FactoryBean的產(chǎn)品。

FactoryBean提供了三個方法:
<li>Object getObject();
<li>Class getObjectType();
<li>boolean isSingleton();

例如:

public class PersonFactory implements FactoryBean{
    Person p = null;
    public Object getObject() throws Exception{
        if(p==null){
            p  = new Chinense();
            return p;
        }
    }
    public Class getObjectType(){
        return Chinese.class;
     }
    public boolean isSingleton(){
        return true;
    }
}
<!--配置一個FactoryBean,和普通的Bean一樣-->
<bean id="chinese" class=""/>
        public static void main(String args[]){\
                //以classpth下的bean.xml創(chuàng)建Reource對象
                ClassPathResource re = new ClasspathResource("bean.xml");
                //創(chuàng)建BeanFactory
                XmlBeanFactory factory = new XmlBeanFactory(re);
                Person p = (Person)factory.getBean("chinese");
                //如需要獲取FactoryBean本身則應(yīng)該在bean id前加&
                Person p = (Person)factory.getBean("&chinese");
        }

對于初學(xué)者可能無法體會到工廠bean的作用恰起,實際上修械,F(xiàn)actoryBean是Spring中非常有用的接口。例如:TransationProxyFactroyBean,這個工廠轉(zhuǎn)為目標Bean創(chuàng)建事務(wù)代理.


6.深入理解依賴關(guān)系配置

<li>組件與組件之間的耦合检盼,采用依賴注入管理祠肥,但是普通的javabean屬性值,應(yīng)直接在代碼里設(shè)置梯皿。

<li>對于singleton作用域的bean,如果沒有強制取消其預(yù)初始化行為县恕,系統(tǒng)會在創(chuàng)建Spring容器時預(yù)初始化所有的singleton作用域的bean东羹,與此同時,該bean依賴的bean也一起被實例化忠烛。

<li>BeanFactory與ApplicationContext實例化容器中的bean的時機不同属提,前者等到程序需要Bean實例才創(chuàng)建Bean,后者會預(yù)初始化容器中的所有Bean。

因為采用ApplicationContext作為Spring的容器美尸,創(chuàng)建容器時冤议,會創(chuàng)建容器中所有singleton作用域的所有bean,因此可能需要更多的系統(tǒng)資源师坎,但是一旦創(chuàng)建成功恕酸。應(yīng)用后面的 響應(yīng)速度會很快,因此胯陋,對于普通的javaEE而言 蕊温,建議使用ApplicationContext作為Spring的容器


Bean實例4種屬性值的設(shè)置
①設(shè)置普通屬性值value

②配置合作者Bean ref

可以為ref元素指定兩個屬性:bena遏乔、Local
bean:引用在不同一份XML配置文件中的其他Bean實例的ID屬性值义矛;
Local:引用同一份XML配置文件的其他Beanid屬性值。
也可以不配置以上兩個屬性盟萨。

③組合屬性名稱:

public class A{
private Person p = new Person();
set/get....
}

`Spring配置文件`

<bean id="a" class="A">
<property name="p.name" value="aaa"/>
</bean>


④注入嵌套Bean:

>```
<bean id="" class="">
       < property name="">
                //屬性為嵌套Bean 不能由Spring容器直接訪問凉翻,因此沒有id屬性
                <bean class="..."/>
        </property>
</bean>

⑤注入集合值:

<list>
<value></value>
<value></value>
</list>

<map>
//每一個entry配置一個key-value對
<entry>
<key>
<value>.</value>
</key>
<value></value>
</entry>
</map>

<set>
<value></value>
<bean></bean>
<ref local=""/>
</set>

<props>
<prop key="">.....</prop>
<prop key="">.....</prop>
</props>


⑥注入方法返回值:

public class ValueGenrator{
public int getValue(){
return 6;
}
public static int getStaticValue(){
return 9;
}
}

<bean id="valueGenrator" class="lee.ValueGenrator"/>
<bean id="son1" class="Son">
<property name="age">
<bean class="org.springframework.bean.factory.congfig.MethodInvokignFactoryBean">
//配置非靜態(tài)方法
<property name="targetObject" ref="valueGenrator"/>
//配置靜態(tài)方法

        <property name="targetMehtod" value="getStaticValue/>

</property>
</bean>


---

**強制初始化Bean**
>Spring有一個默認的規(guī)則,總是先初始化主調(diào)Bean捻激,然后在初始化依賴Bean制轰。
為了指定Bean在目標Bean之前初始化,可以使用**depends-on**屬性.

>`大多數(shù)情況下`铺罢,Bean之間的依賴關(guān)系非常直接艇挨,Spring容器在返回Bean實例之前,完成Bean依賴關(guān)系的注入韭赘。假如Bean A依賴于Bean B缩滨,程序請求Bean A時,Spring容器會自動先初始化Bean B,再將Bean B注入Bean A脉漏,最后將具備完整依賴的Bean A返回給程序苞冯。
`在極端的情況下`,Bean之間的依賴不夠直接侧巨。比如某個類的初始化塊中使用其他Bean舅锄,Spring總是先初始化主調(diào)Bean,執(zhí)行初始化塊時還沒有實例化主調(diào)Bean司忱,被依賴的Bean還沒實例化皇忿,此時將引發(fā)異常。

>為了讓指定Bean在目標Bean之前初始化坦仍,可以使用 depends-on 屬性鳍烁,該屬性可以在初始化主調(diào)Bean之前,強制初始化一個或多個Bean繁扎。

<bean id="beanOne" class="ExampleBean" depends-on="manager">
<property name="manager" ref="manager"/>
</bean>
<bean id="manager" class="ManagerBean"/>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幔荒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梳玫,更是在濱河造成了極大的恐慌爹梁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件提澎,死亡現(xiàn)場離奇詭異姚垃,居然都是意外死亡,警方通過查閱死者的電腦和手機盼忌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門莉炉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碴犬,你說我怎么就攤上這事絮宁。” “怎么了服协?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵绍昂,是天一觀的道長。 經(jīng)常有香客問我偿荷,道長窘游,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任跳纳,我火速辦了婚禮忍饰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寺庄。我一直安慰自己艾蓝,他們只是感情好力崇,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赢织,像睡著了一般亮靴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上于置,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天茧吊,我揣著相機與錄音,去河邊找鬼八毯。 笑死搓侄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的话速。 我是一名探鬼主播休讳,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尿孔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筹麸,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤活合,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后物赶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體白指,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年酵紫,在試婚紗的時候發(fā)現(xiàn)自己被綠了告嘲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡奖地,死狀恐怖橄唬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情参歹,我是刑警寧澤仰楚,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站犬庇,受9級特大地震影響僧界,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜臭挽,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一捂襟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧欢峰,春花似錦葬荷、人聲如沸涨共。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煞赢。三九已至,卻和暖如春哄孤,著一層夾襖步出監(jiān)牢的瞬間照筑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工瘦陈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凝危,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓晨逝,卻偏偏與公主長得像蛾默,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捉貌,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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