Spring實戰之通過XML裝配bean


  盡管Spring長期以來確實與XML有着關聯,但現在需要明確的是,XML不再是配置Spring的唯一可選方案。Spring現在有了強大的自動化配置和基於Java的配置,XML不應該再是你的第一選擇了。不過,鑒於已經存在那么多基於XML的Spring配置,所以理解如何在Spring中使用XML還是很重要的。但是,我希望本節的內容只是用來幫助你維護已有的XML配置,在完成新的Spring工作時,希望你會使用自動化配置和JavaConfig。

1.1創建XML配置規范

在使用XML為Spring裝配bean之前,你需要創建一個新的配置規范。在使用JavaConfig的時候,這意味着要創建一個帶有@Configuration注解的類,而在XML配置中,這意味着要創建一個XML文件,並且要以<beans>元素為根。

 

  很容易就能看出來,這個基本的XML配置已經比同等功能的JavaConfig類復雜得多了。作為起步,在JavaConfig中所需要的只是@Configuration,但在使用XML時,需要在配置文件的頂部聲明多個XML模式(XSD)文件,這些文件定義了配置Spring的XML元素。借助Spring Tool Suite創建XML配置文件創建和管理Spring XML配置文件的一種簡便方式是使用Spring ToolSuite(https://spring.io/tools/sts)。在Spring Tool Suite的菜單中,選擇File>New>Spring Bean Configuration File,能夠創建SpringXML配置文件,並且可以選擇可用的配置命名空間。

1.2聲明一個簡單的<bean>

 

要在基於XML的Spring配置中聲明一個bean,我們要使用spring-beans模式中的另外一個元素:<bean>。<bean>元素類似於JavaConfig中的@Bean注解。我們可以按照如下的方式聲明CompactDiscbean:

  這里聲明了一個很簡單的bean,創建這個bean的類通過class屬性來指定的,並且要使用全限定的類名。因為沒有明確給定ID,所以這個bean將會根據全限定類名來進行命名。在本例中,bean的ID將會是“soundsystem.SgtPeppers#0”。其中,“#0”是一個計數的形式,用來區分相同類型的其他bean。如果你聲明了另外一個SgtPeppers,並且沒有明確進行標識,那么它自動得到的ID將會是“soundsystem.SgtPeppers#1”。盡管自動化的bean命名方式非常方便,但如果你要稍后引用它的話,那自動產生的名字就沒有多大的用處了。因此,通常來講更好的辦法是借助id屬性,為每個bean設置一個你自己選擇的名字:

1.3借助構造器注入初始化bean

在Spring XML配置中,只有一種聲明bean的方式:使用<bean>元素並指定class屬性。Spring會從這里獲取必要的信息來創建bean。但是,在XML中聲明DI時,會有多種可選的配置方案和風格。具體到

構造器注入,有兩種基本的配置方案可供選擇:

 

構造器注入bean引用按照現在的定義,CDPlayerbean有一個接受CompactDisc類型的構造器。這樣,我們就有了一個很好的場景來學習如何注入bean的引用。現在已經聲明了SgtPeppers bean,並且SgtPeppers類實現了CompactDisc接口,所以實際上我們已經有了一個可以注入到CDPlayerbean中的bean。我們所需要做的就是在XML中聲明CDPlayer並通過ID引用SgtPeppers:

當Spring遇到這個<bean>元素時,它會創建一個CDPlayer實例。<constructor-arg>元素會告知Spring要將一個ID為compactDisc的bean引用傳遞到CDPlayer的構造器中。

作為替代的方案,你也可以使用Spring的c-命名空間。c-命名空間是在Spring 3.0中引入的,它是在XML中更為簡潔地描述構造器參數的方式。要使用它的話,必須要在XML的頂部聲明其模式,如下所示

在c-命名空間和模式聲明之后,我們就可以使用它來聲明構造器參數
了,如下所示:

 

  迄今為止,我們所做的DI通常指的都是類型的裝配——也就是將對象的引用裝配到依賴於它們的其他對象之中——而有時候,我們需要做的只是用一個字面量值來配置對象。為了闡述這一點,假設你要創建CompactDisc的一個新實現,如下所示:

  在SgtPeppers中,唱片名稱和藝術家的名字都是硬編碼的,但是這個CompactDisc實現與之不同,它更加靈活。像現實中的空磁盤一樣,它可以設置成任意你想要的藝術家和唱片名。現在,我們可以將

已有的SgtPeppers替換為這個類:

我們再次使用<constructor-arg>元素進行構造器參數的注入。但是這一次我們沒有使用“ref”屬性來引用其他的bean,而是使用了value屬性,通過該屬性表明給定的值要以字面量的形式注入到構造器之中。如果要使用c-命名空間的話,這個例子又該是什么樣子呢?第一種方案是引用構造器參數的名字:

  在裝配bean引用和字面量值方面,<constructor-arg>和c-命名空間的功能是相同的。但是有一種情況是<constructor-arg>能夠實現,c-命名空間卻無法做到的。接下來,讓我們看一下如何將集合

裝配到構造器參數中。

 

 

 

首先,可以使用<list>元素將其聲明為一個列

當list中元素是引用類型時

1.4設置屬性

  到目前為止,CDPlayer和BlankDisc類完全是通過構造器注入的,沒有使用屬性的Setter方法。接下來,我們就看一下如何使用Spring XML實現屬性注入。假設屬性注入的CDPlayer如下所示:

 

 

 <property>元素為屬性的Setter方法所提供的功能與<constructor-arg>元素為構造器所提供的功能是一樣的。在本例中,它引用了ID為compactDisc的bean(通過ref屬性),並將其注入到compactDisc屬性中(通過setCompactDisc()方法)。如果你現在運行測試的話,它應該就能通過了。

  我們已經知道,Spring為<constructor-arg>元素提供了c-命名空間作為替代方案,與之類似,Spring提供了更加簡潔的p-命名空間,作為<property>元素的替代方案。為了啟用p-命名空間,必須要在XML文件中與其他的命名空間一起對其進行聲明:

我們可以使用p-命名空間,按照以下的方式裝配compactDisc屬性

不過,BlankDisc這次完全通過屬性
注入進行配置,而不是構造器注入。新的BlankDisc類如下所示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM