天天看點

JAVA入門[13]-Spring裝配Bean

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>&lt;context:component-scan base-</code><code>package</code><code>=</code><code>"autowire.bean"</code><code>&gt;&lt;/context:component-scan&gt;</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>&lt;bean </code><code>class</code><code>=</code><code>"bean.Category"</code><code>&gt;</code>

<code>   </code><code>&lt;constructor-arg name=</code><code>"id"</code> <code>value=</code><code>"100"</code><code>&gt;&lt;/constructor-arg&gt;</code>

<code>&lt;/bean&gt;</code>

<code>  &lt;constructor-arg index=</code><code>"0"</code> <code>value=</code><code>"100"</code><code>&gt;&lt;/constructor-arg&gt;</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-命名空間

這種文法用起來簡化一些。

JAVA入門[13]-Spring裝配Bean

調整②中的bean節點:

<code>&lt;bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>c:_0=</code><code>"100"</code><code>&gt;&lt;/bean&gt;</code>

<code>&lt;bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>c:id=</code><code>"100"</code><code>&gt;&lt;/bean&gt;</code>

①通過為bean設定property實作屬性

<code>&lt;bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>&gt;</code>

<code>      </code><code>&lt;property name=</code><code>"cateId"</code> <code>value=</code><code>"100"</code><code>&gt;&lt;/property&gt;</code>

②p-命名空間

前面的bean配置可以簡化為:

<code>&lt;bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>p:cateId=</code><code>"100"</code><code>&gt;&lt;/bean&gt;</code>

JAVA入門[13]-Spring裝配Bean

Spring支援将屬性定義到外部的屬性的檔案中,并使用占位符值将其插入到Spring bean中。在Spring裝配中,占位符的形式為使用“${ ... }”包裝的屬性名稱。

config.properties:

<code>cateid=</code><code>100</code>

spring-config.xml:

<code>&lt;bean id=</code><code>"propertyConfigurer"</code> <code>class</code><code>=</code><code>"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</code><code>&gt;</code>

<code>       </code><code>&lt;property name=</code><code>"locations"</code><code>&gt;</code>

<code>           </code><code>&lt;list&gt;</code>

<code>               </code><code>&lt;value&gt;classpath:properties/config.properties&lt;/value&gt;</code>

<code>           </code><code>&lt;/list&gt;</code>

<code>       </code><code>&lt;/property&gt;</code>

<code>   </code><code>&lt;/bean&gt;</code>

<code>   </code><code>&lt;bean </code><code>class</code><code>=</code><code>"bean.Category"</code> <code>p:cateId=</code><code>"${cateid}"</code><code>&gt;&lt;/bean&gt;</code>

    本文轉自 陳敬(Cathy) 部落格園部落格,原文連結:http://www.cnblogs.com/janes/p/6868149.html,如需轉載請自行聯系原作者