Sping裝配bean主要有三種裝配機制:
在XML中進行顯式配置。
在Java中進行顯式配置。
隐式的bean發現機制和自動裝配。
原則:
建議盡可能地使用自動配置的機制,顯式配置越少越好。當你必須要顯式配置bean的時候(比如,有些源碼不是由你來維護的,而當你需要為這些代碼配置bean的時候),我推薦使用類型安全并且比XML更加強大的JavaConfig。最後,隻有當你想要使用便利的XML命名空間,并且在JavaConfig中沒有同樣的實作時,才應該使用XML。
Spring從兩個角度來實作自動化裝配:
元件掃描(component scanning):Spring會自動發現應用上下文中所建立的bean。
自動裝配(autowiring):Spring自動滿足bean之間的依賴
@Component注解:添加注解表明該類會作為元件類,并告知Spring要為這個類建立bean。
<code>package</code> <code>bean;</code>
<code>import</code> <code>org.springframework.stereotype.Component;</code>
<code>@Component</code>
<code>public</code> <code>class</code> <code>Category {</code>
<code> </code><code>private</code> <code>int</code> <code>cateId;</code>
<code> </code><code>public</code> <code>int</code> <code>getCateId() {</code>
<code> </code><code>return</code> <code>this</code><code>.cateId;</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>setCateId(</code><code>int</code> <code>id) {</code>
<code> </code><code>this</code><code>.cateId = id;</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>String toString() {</code>
<code> </code><code>return</code> <code>" 商品類型 id="</code> <code>+ </code><code>this</code><code>.cateId;</code>
<code>}</code>
①使用XML來啟用元件掃描,在applicationContext.xml配置:
<code><context:component-scan base-</code><code>package</code><code>=</code><code>"autowire.bean"</code><code>></context:component-scan></code>
單元測試:
<code>@ContextConfiguration</code><code>(locations = </code><code>"classpath*:applicationContext.xml"</code><code>)</code>
<code>@RunWith</code><code>(SpringJUnit4ClassRunner.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>testAutowireXml {</code>
<code> </code><code>@Autowired</code>
<code> </code><code>private</code> <code>Category category;</code>
<code> </code><code>@Test</code>
<code> </code><code>public</code> <code>void</code> <code>TestXmlBean() {</code>
<code> </code><code>Assert.assertNotNull(category);</code>
②使用java配置
前面的bean類不做任何調整,通過@ComponentScan注解實作自動掃描。例如建立java配置檔案BeanConfig.java
<code>@Configuration</code>
<code>@ComponentScan</code><code>(basePackageClasses = bean.Category.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>BeanConfig {</code>
<code>@ContextConfiguration</code><code>(classes = BeanConfig.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>testAutowireJava {</code>
<code> </code><code>public</code> <code>void</code> <code>categoryNotNull() {</code>
上面的BeanConfig就是用java config方式實作的。java Config也是一個java類,但它不應該包含任何業務邏輯,也不應該侵入到業務邏輯代碼之中,通常會将JavaConfig放到單獨的包中。
建立java config關鍵是使用@Configuration ,表明這個類是一個配置類,該類應該包含在Spring應用上下文中如何建立bean的細節。
在JavaConfig中聲明bean,我們需要編寫一個方法,這個方法會建立所需類型的執行個體,然後給這個方法添加@Bean注解。
我們建立一個config檔案JavaConfig.java,是在BeanConfig.java基礎上去掉@ComponentScan注解,并添加category()傳回Category執行個體。
<code>public</code> <code>class</code> <code>JavaConfig {</code>
<code> </code><code>@Bean</code>
<code> </code><code>public</code> <code>Category category(){</code>
<code> </code><code>return</code> <code>new</code> <code>Category();</code>
<code>@ContextConfiguration</code><code>(classes = JavaConfig.</code><code>class</code><code>)</code>
<code>public</code> <code>class</code> <code>testJavaConfig {</code>
<code> </code><code>public</code> <code>void</code> <code>testCategoryBean(){</code>
①首先為Category添加構造函數:
<code> </code><code>public</code> <code>Category() {</code>
<code> </code><code>public</code> <code>Category(</code><code>int</code> <code>id) {</code>
<code> </code><code>cateId = id;</code>
<code> </code><code>this</code><code>.cateId = id;</code>
②applicationContext添加bean節點,為constructor-arg設定Id或者index。
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code><code>></code>
<code> </code><code><constructor-arg name=</code><code>"id"</code> <code>value=</code><code>"100"</code><code>></constructor-arg></code>
<code></bean></code>
或
<code> <constructor-arg index=</code><code>"0"</code> <code>value=</code><code>"100"</code><code>></constructor-arg></code>
③單元測試:
<code>……</code>
<code> </code><code>public</code> <code>void</code> <code>testId(){</code>
<code> </code><code>Assert.assertEquals(</code><code>100</code><code>,category.getCateId());</code>
④c-命名空間
這種文法用起來簡化一些。

調整②中的bean節點:
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>c:_0=</code><code>"100"</code><code>></bean></code>
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>c:id=</code><code>"100"</code><code>></bean></code>
①通過為bean設定property實作屬性
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>></code>
<code> </code><code><property name=</code><code>"cateId"</code> <code>value=</code><code>"100"</code><code>></property></code>
②p-命名空間
前面的bean配置可以簡化為:
<code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>p:cateId=</code><code>"100"</code><code>></bean></code>
Spring支援将屬性定義到外部的屬性的檔案中,并使用占位符值将其插入到Spring bean中。在Spring裝配中,占位符的形式為使用“${ ... }”包裝的屬性名稱。
config.properties:
<code>cateid=</code><code>100</code>
spring-config.xml:
<code><bean id=</code><code>"propertyConfigurer"</code> <code>class</code><code>=</code><code>"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</code><code>></code>
<code> </code><code><property name=</code><code>"locations"</code><code>></code>
<code> </code><code><list></code>
<code> </code><code><value>classpath:properties/config.properties</value></code>
<code> </code><code></list></code>
<code> </code><code></property></code>
<code> </code><code></bean></code>
<code> </code><code><bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>p:cateId=</code><code>"${cateid}"</code><code>></bean></code>
本文轉自 陳敬(Cathy) 部落格園部落格,原文連結:http://www.cnblogs.com/janes/p/6868149.html,如需轉載請自行聯系原作者