日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

(转) Spring读书笔记-----Spring的Bean之配置依赖

發(fā)布時間:2023/11/29 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转) Spring读书笔记-----Spring的Bean之配置依赖 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前一篇博客介紹了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í)例化。

????????? BeanFactoryApplicationContext實(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?
  • <bean?id="person"?class="lee.Person">??
  • ????<!--?Property配置需要依賴注入的屬性?-->??
  • ????<property?name="name"?value="chenming"?/>??
  • ????<property?name="age"?value="22"?/>??
  • </bean>??
  • <bean id="person" class="lee.Person"><!-- Property配置需要依賴注入的屬性 --><property name="name" value="chenming" /><property name="age" value="22" /></bean>

    ?

    ????????? Spring會為<bean…/>元素創(chuàng)建一個java對象,一個這樣的java對象對應(yīng)一個Bean實(shí)例,對于如上代碼,Spring會采用如下形式來創(chuàng)建Java實(shí)例。

    ?

    [java] view plaincopyprint?
  • //獲取lee.Person類的Class對象??
  • Class??personClass?=?Class.forName("lee.Person");??
  • //創(chuàng)建lee.Person類的默認(rèn)實(shí)例??
  • Object?personBean?=?personBean.newInStance();??
  • //獲取lee.Person類的Class對象Class personClass = Class.forName("lee.Person");//創(chuàng)建lee.Person類的默認(rèn)實(shí)例Object personBean = personBean.newInStance();


    ????????? 創(chuàng)建該實(shí)例后,Spring就會遍歷該<bean../>元素的所有<property…/>子元素。<bean…/>元素每包含一個<property…/>子元素,Spring就會為該Bean實(shí)例調(diào)用一次setter方法。類似于下面程序:

    [java] view plaincopyprint?
  • //獲取name屬性的setter方法??
  • String?setName?=?"set"+"Name";??
  • //獲取lee.Person類里面的Set()Name方法??
  • java.lang.reflect.Method?setMethod?=?personClass.getMethod(setName,?aVal.getClass());??
  • //調(diào)用Bean實(shí)例的SetName()方法??
  • setMethod.invoke(personBean,?aVal);??
  • //獲取name屬性的setter方法String setName = "set"+"Name";//獲取lee.Person類里面的Set()Name方法java.lang.reflect.Method setMethod = personClass.getMethod(setName, aVal.getClass());//調(diào)用Bean實(shí)例的SetName()方法setMethod.invoke(personBean, aVal);


    ????????? 對于使用<constructor-arg…/>元素來指定構(gòu)造器注入,Spring不會采用默認(rèn)的構(gòu)造器來創(chuàng)建Bean實(shí)例,而是使用特定的構(gòu)造器來創(chuàng)建該Bean實(shí)例。

    [html] view plaincopyprint?
  • <bean?id="person"?class="lee.Person">??
  • ????<constructor-arg?index="0"?value="aVal"?/>??
  • ????<constructor-arg?index="1"?value="bVal"?/>??
  • </bean>??
  • <bean id="person" class="lee.Person"><constructor-arg index="0" value="aVal" /><constructor-arg index="1" value="bVal" /></bean>

    ?

    ????????? 針對上面的代碼,Spring會采用類似如下的代碼來創(chuàng)建Bean實(shí)例:

    [java] view plaincopyprint?
  • //獲取lee.Person類的class對象??
  • Class??personClass?=?Class.forName("lee.Person");??
  • //獲取第一個參數(shù)是aVal類型,第二個參數(shù)是bVal類型的構(gòu)造器??
  • Constructor?personCtr?=?personClass.getConstructor(aVal.getClass(),bVal.getClass());??
  • //以指定構(gòu)造器創(chuàng)建Bean實(shí)例??
  • Object?bean?=?personCtr.newInstance(aVal,bVal);??
  • //獲取lee.Person類的class對象Class personClass = Class.forName("lee.Person");//獲取第一個參數(shù)是aVal類型,第二個參數(shù)是bVal類型的構(gòu)造器Constructor personCtr = personClass.getConstructor(aVal.getClass(),bVal.getClass());//以指定構(gòu)造器創(chuàng)建Bean實(shí)例Object bean = personCtr.newInstance(aVal,bVal);


    ????????? 上面的程序只是一個實(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。