javascript
(转) Spring读书笔记-----Spring的Bean之配置依赖
前一篇博客介紹了Spring中的Bean的基本概念和作用域(Spring讀書筆記-----Spring的Bean之Bean的基本概念 ),現(xiàn)在介紹Spring Bean的基本配置。
????????? 從開始我們知道Java應(yīng)用中各組件的相互調(diào)用的實(shí)質(zhì)可以歸納為依賴關(guān)系。根據(jù)注入方式的不同,Bean的依賴注入可以分為兩種形式:
????????? 1、? 屬性:通過<property …/>元素配置,對應(yīng)設(shè)置注入。
????????? 2、? 構(gòu)造器參數(shù):通過<constructor-arg…/>元素配置,對應(yīng)構(gòu)造注入。
????????? 不管是屬性,還是構(gòu)造器參數(shù),都視為Bean的依賴,接受Spring容器管理,依賴關(guān)系的值要么是一個確定的值,要么是Spring容器中的其他Bean的引用。
????????? 在一般情況下,我是不應(yīng)該在配置文件中管理普通屬性的引用,通常只是用配置文件管理容器中的Bean實(shí)例的依賴關(guān)系。
????????? Spring在實(shí)例化容器時,會校驗(yàn)BeanFactory中每一個Bean的配置。這些校驗(yàn)包括:
????????? Bean引用的依賴Bean是否指向一個合法的Bean。
????????? Bean的普通屬性值是否獲得一個有效值。
??????? 對于singleton作用域的Bean,如果沒有強(qiáng)行取消其預(yù)初始化的行為,系統(tǒng)會在創(chuàng)建Spring容器時預(yù)初始化所用singleton Bean,與此同時,該Bean所依賴的Bean也被一起實(shí)例化。
????????? BeanFactory與ApplicationContext實(shí)例化容器中的Bean的時機(jī)也是不同的:BeanFactory等到程序需要Bean實(shí)例時才創(chuàng)建Bean,而ApplicationContext是在創(chuàng)建ApplicationContext實(shí)例時,會預(yù)初始化容器中的全部Bean。同時在創(chuàng)建BeanFactory時不會立即創(chuàng)建Bean實(shí)例,所以有可能程序可以正確地創(chuàng)建BeanFactory實(shí)例,但是當(dāng)請求Bean實(shí)例時依然拋出一個異常:創(chuàng)建Bean實(shí)例或注入它的依賴關(guān)系時出現(xiàn)錯誤。所以當(dāng)配置錯誤的延遲出現(xiàn),會給系統(tǒng)帶來一些不安全的因素。而ApplicationContext則是默認(rèn)預(yù)初始化所有singleton作用域的Bean,所以ApplicationContext實(shí)例化過程比BeanFactory實(shí)例化過程的時間和內(nèi)存開銷大,但是一旦創(chuàng)建成功,應(yīng)用后面的響應(yīng)速度會非常快,同時可以檢驗(yàn)出配置錯誤,故一般都是推薦使用ApplicationContext作為Spring容器。
?????????? 其實(shí)我們可以指定lazy-int=”true”來強(qiáng)制取消singleton作用域的Bean的預(yù)初始。這樣該Bean就不會隨著ApplicationContext啟動而預(yù)實(shí)例化了。
????????? Spring可以為任何java對象注入任何類型的屬性,只要改java對象為該屬性提供了對應(yīng)的setter方法即可。
[html] view plaincopyprint??
????????? Spring會為<bean…/>元素創(chuàng)建一個java對象,一個這樣的java對象對應(yīng)一個Bean實(shí)例,對于如上代碼,Spring會采用如下形式來創(chuàng)建Java實(shí)例。
?
[java] view plaincopyprint?????????? 創(chuàng)建該實(shí)例后,Spring就會遍歷該<bean../>元素的所有<property…/>子元素。<bean…/>元素每包含一個<property…/>子元素,Spring就會為該Bean實(shí)例調(diào)用一次setter方法。類似于下面程序:
[java] view plaincopyprint?
????????? 對于使用<constructor-arg…/>元素來指定構(gòu)造器注入,Spring不會采用默認(rèn)的構(gòu)造器來創(chuàng)建Bean實(shí)例,而是使用特定的構(gòu)造器來創(chuàng)建該Bean實(shí)例。
?
????????? 針對上面的代碼,Spring會采用類似如下的代碼來創(chuàng)建Bean實(shí)例:
[java] view plaincopyprint?
????????? 上面的程序只是一個實(shí)例,實(shí)際上Spring還需要根據(jù)<property…/>元素、<contructor-arg../>元素所使用value屬性,ref屬性等來判斷需要注入的到底是什么數(shù)據(jù)類型,并要對這些值進(jìn)行合適的類型轉(zhuǎn)換,所以Spring的實(shí)際處理過程會更加復(fù)雜。
?
??????????? 讀李剛《輕量級Java EE企業(yè)應(yīng)用實(shí)戰(zhàn)》
轉(zhuǎn)載于:https://www.cnblogs.com/zzzzw/p/4580969.html
總結(jié)
以上是生活随笔為你收集整理的(转) Spring读书笔记-----Spring的Bean之配置依赖的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到公鸡和母鸡是什么意思
- 下一篇: javascript中String的fr