引用:使用index屬性除了可以解決多個簡單類型構造參數造成的模棱兩可的問題之外,還可以用來解決兩個構造參數類型相同造成的麻煩。注意:index屬性值從0開始。
在上面的例子中,<code>child</code>bean的<code>adminEmails</code>屬性的<code><props/></code>元素上使用了<code>merge=true</code>屬性。當<code>child </code>bean被容器實際解析及執行個體化時,其 <code>adminEmails</code>将與父集合的<code>adminEmails</code>屬性進行合并。
上述的配置等同于Java代碼:<code>exampleBean.setEmail(null)</code>。
等同于:
當設定bean的組合屬性時,除了最後一個屬性外,隻要其他屬性值不為null,組合或嵌套屬性名是完全合法的。例如,下面bean的定義:
<code>foo</code> bean有個<code>fred</code>屬性,此屬性有個 <code>bob</code>屬性,而<code>bob</code>屬性又有個<code>sammy</code>屬性,最後把<code>sammy</code>屬性設定為<code>123</code>。為了讓此定義能工作, <code>foo</code>的<code>fred</code>屬性及<code>fred</code> 的<code>bob</code>屬性在bean被構造後都必須非空,否則将抛出<code>NullPointerException</code>異常。
若需要表達對多個bean的依賴,可以在<code>'depends-on'</code>中将指定的多個bean名字用分隔符進行分隔,分隔符可以是逗号、空格及分号等。下面的例子中使用了<code>'depends-on'</code>來表達對多個bean的依賴。
<code>ApplicationContext</code>實作的預設行為就是在啟動時将所有<code>singleton</code> bean提前進行執行個體化。提前執行個體化意味着作為初始化過程的一部分,<code>ApplicationContext</code>執行個體會建立并配置所有的singleton bean。通常情況下這是件好事,因為這樣在配置中的任何錯誤就會即刻被發現(否則的話可能要花幾個小時甚至幾天)。
有時候這種預設處理可能并不是你想要的。如果你不想讓一個singleton bean在<code>ApplicationContext</code>實作在初始化時被提前執行個體化,那麼可以将bean設定為延遲執行個體化。一個延遲初始化bean将告訴IoC 容器是在啟動時還是在第一次被用到時執行個體化。
在XML配置檔案中,延遲初始化将通過<code><bean/></code>元素中的<code>lazy-init</code>屬性來進行控制。
模式
說明
no
不使用自動裝配。必須通過ref元素指定依賴,這是預設設定。由于顯式指定協作者可以使配置更靈活、更清晰,是以對于較大的部署配置,推薦采用該設定。而且在某種程度上,它也是系統架構的一種文檔形式。
byName
根據屬性名自動裝配。此選項将檢查容器并根據名字查找與屬性完全一緻的bean,并将其與屬性自動裝配。例如,在bean定義中将autowire設定為by name,而該bean包含master屬性(同時提供setMaster(..)方法),Spring就會查找名為master的bean定義,并用它來裝配給master屬性。
byType
如果容器中存在一個與指定屬性類型相同的bean,那麼将與該屬性自動裝配。如果存在多個該類型的bean,那麼将會抛出異常,并指出不能使用byType方式進行自動裝配。若沒有找到相比對的bean,則什麼事都不發生,屬性也不會被設定。如果你不希望這樣,那麼可以通過設定dependency-check="objects"讓Spring抛出異常。
constructor
與byType的方式類似,不同之處在于它應用于構造器參數。如果在容器中沒有找到與構造器參數類型一緻的bean,那麼将會抛出異常。
autodetect
通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。如果發現預設的構造器,那麼将使用byType方式。
了解自動裝配的優缺點是很重要的。其中優點包括:
· 自動裝配可以使配置與java代碼同步更新。例如,如果你需要給一個java類增加一個依賴,那麼該依賴将被自動實作而不需要修改配置。是以強烈推薦在開發過程中采用自動裝配,而在系統趨于穩定的時候改為顯式裝配的方式。
自動裝配的一些缺點:
· 盡管自動裝配比顯式裝配更神奇,但是,正如上面所提到的,Spring會盡量避免在裝配不明确的時候進行猜測,因為裝配不明确可能出現難以預料的結果,而且Spring所管理的對象之間的關聯關系也不再能清晰的進行文檔化。
· 對于那些根據Spring配置檔案生成文檔的工具來說,自動裝配将會使這些工具沒法生成依賴資訊。
· 如果采用by type方式自動裝配,那麼容器中類型與自動裝配bean的屬性或者構造函數參數類型一緻的bean隻能有一個,如果配置可能存在多個這樣的bean,那麼就要考慮采用顯式裝配了。
盡管使用autowire沒有對錯之分,但是能在一個項目中保持一定程度的一緻性是最好的做法。例如,通常情況下如果沒有使用自動裝配,那麼僅自動裝配一個或兩個bean定義可能會引起開發者的混淆。
<bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/>
<bean id="accountService" class="com.foo.DefaultAccountService" singleton="true"/>
Prototype作用域的bean會導緻在每次對該bean請求(将其注入到另一個bean中,或者以程式的方式調用容器的<code>getBean()</code>方法)時都會建立一個新的bean執行個體。根據經驗,對所有有狀态的bean應該使用prototype作用域,而對無狀态的bean則應該使用singleton作用域。
簡單地說,如果你用"<code>singleton</code>"屬性那麼就必須在那個檔案裡引用<code>'spring-beans.dtd'</code> DTD。 如果你用"<code>scope</code>"屬性那麼必須 在那個檔案裡引用<code>'spring-beans-2.0.dtd'</code> DTD 或<code>'spring-beans-2.0.xsd'</code> XSD。
針對每次HTTP請求,Spring容器會根據<code>loginAction</code> bean定義建立一個全新的<code>LoginAction</code> bean執行個體,且該<code>loginAction</code> bean執行個體僅在目前HTTP request内有效,是以可以根據需要放心的更改所建執行個體的内部狀态,而其他請求中根據<code>loginAction</code> bean定義建立的執行個體,将不會看到這些特定于某個請求的狀态變化。當處理請求結束,request作用域的bean執行個體将被銷毀。
針對某個HTTP <code>Session</code>,Spring容器會根據<code>userPreferences</code> bean定義建立一個全新的<code>userPreferences</code> bean執行個體,且該<code>userPreferences</code> bean僅在目前HTTP <code>Session</code>内有效。與<code>request作用域</code>一樣,你可以根據需要放心的更改所建立執行個體的内部狀态,而别的HTTP <code>Session</code>中根據<code>userPreferences</code>建立的執行個體,将不會看到這些特定于某個HTTP <code>Session</code>的狀态變化。當HTTP <code>Session</code>最終被廢棄的時候,在該HTTP <code>Session</code>作用域内的bean也會被廢棄掉。
今天下午寫了一個基于SpringMVC的架構,内部包含JSTL,明天會加上displaytag,今天又遇到了“監聽器異常”的問題,經過 檢查發現我的jdbc.properties檔案用的classpath,問題解決,還遇到了兩個字母敲錯了的錯誤,解決,明天的任務是使用 displaytag把資料庫的資料取出來導出為各種格式的(pdf、excel)
(我們一般隻用他的跳轉功能)類的方法,
Method Summary
Return the name of the view to delegate to.
Return a ModelAndView object with the specified view name.
<code>protected void</code>
Subclasses can override this for custom initialization behavior.
<code> void</code>
Set the name of the view to delegate to.
子類可以繼承并實作initApplicationContext這個方法,用于初始化一些屬性
本文轉自yunlielai51CTO部落格,原文連結:http://blog.51cto.com/4925054/1060111,如需轉載請自行聯系原作者