程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 從spring的IOC說起(二)——spring的Bean的基礎配置

從spring的IOC說起(二)——spring的Bean的基礎配置

編輯:關於JAVA

上次簡單的說了下spring的IOC,也說到了spring的IOC強大在於有一系列可 以維護Bean不同關系的維護類的存在,而這樣的維護也是基於高度可配置的 spring配置文件而言的。這次就是結合我的使用spring的IOC來講講我在使用中 的體會,當然,這裡涉及的內容不會很高深,但是也必須讀者能夠讀懂簡單的 Bean配置才可以。

我們這裡只講spring的IOC,AOP不在這范圍之內,雖然AOP也是基於IOC之上 的,至於那些集合啊什麼的配置也不是這裡的重點。我們這裡說spring的Bean配 置,主要就是說如何配置Bean在配置文件中,可以使結構更加合理化和使我們的 編寫量更少,當然我所說的也不一定對,也是和大家一起討論討論:),也希望 大家可以提出更好的方法或模式。

在spring的Bean配置中總的來說其實就一個標簽<bean></bean> ,這個bean標簽就攘括了幾乎所有的配置,然後bean的繼承、抽象等都是基於此 標簽之上的,掌握了bean的配置,詳細可以使自己有一個比較大的提升,尤其是 對於新手來說(我也是,呵呵 )。最基礎的bean配置如下:

<bean id="bean_test" class="cn.qtone.test.HelloWorld"></bean>

這裡我們就簡單的使用HelloWorld類來實例化,使用默認的構造方法,即相 當於我們使用:

HelloWorld tmp = new HelloWorld();

但有一點不同的是在spring配置中的在整個應用期間只有一個實例,即是單 例的,當然這個單例是指對一個IOC容器(spring)來說的,而不是我們通常說 說的單態模式。當然,spring也可以這樣配置不是單態的實例,比如我們修改如 下:

<bean id="bean_test" class="cn.qtone.test.HelloWorld" scope="prototype"></bean>

注意其中的不同顏色部分,這樣配置後就表明每次從spring容器中獲取 HelloWorld的實例的時候就會new一個新對象,即我們所說的原型,spring中 scope默認的是單態(singleton),當然針對web應用程序,還可以配置為 request、session等范圍。至於什麼時候使用什麼權限范圍就要看應用程序的使 用了,比如在多線程程序中,單態是否會對程序有所影響就需要考慮了。

如果HelloWorld類沒有空的構造方法,只有如下的兩個構造方法,那我們該 如何配置呢?

……
public HelloWorld(String str)
{
   ……
}

public HelloWorld(Date date, int i)
{
   ……
}
……

由於沒有默認構造方法,所以我們就需要在bean的配置中寫上構造參數才可 以,如下:

<!-- 使用一個參數的構造 -->
<bean id="bean_test" class="cn.qtone.test.HelloWorld" scope="prototype">
   <constructor- arg><value>hello</value></constructor-arg>
</bean>

上面說的使用一個參數的,即帶字符串參數的構造方法,如果想使用帶日期 和整型的構造方法,那麼就要做如下的配置了:

<bean id="bean_date" class="java.util.Date" />

<!-- 使用二個參數的構造 -->
<bean id="bean_test" class="cn.qtone.test.HelloWorld" scope="prototype">
   <constructor-arg ref="bean_date"></constructor-arg>
   <constructor-arg><value>345</value></constructor -arg>
</bean>

注意到上面的配置中我們使用了ref關鍵字,這個是表示引用配置文件中的ID 為bean_date的對象,另外對於類型,spring會做恰當的轉換,比如將345轉換成 數字等。當然,這樣對簡單的構造來說不會有什麼問題,如果情況比較復雜的話 ,那麼一般建議使用序號來標定,如下:

<!-- 使用二個參數的構造 -->
<bean id="bean_test" class="cn.qtone.test.HelloWorld" scope="prototype">
   <constructor-arg index="0"ref="bean_date"></constructor- arg>
   <constructor-arg index="1"><value>345</value></constructor- arg>
</bean>

這樣,使用index屬性表示該參數所在位置了後,無論是spring構造起來,還 是我們查看都會很方便。當然,spring也提供了自動查找,也就是依賴查找的功 能,但是這個我覺得大家還是少用,因為這樣會使整個配置文件看起來非常的不 直觀,而且不清晰,說不定過了一段時間再去看的時候就不知道是什麼意思了, 在正式應用項目中,還是將各個bean的關系進行組織和編寫清楚為好。

上面所說的都是構造來實例化一個bean,但有時候我們都會使用工廠模式來 獲取bean。對於工廠模式,我們一般也使用靜態工廠模式和實例工廠模式,這兩 個在spring中配置也是不太一樣的。對於靜態工廠模式來實例化bean的,我們的 配置如下:

<bean id="bean_string" class="cn.qtone.test.TestFactory" factory-method="getBean"/>

當然,我們也可以為靜態工廠模式的bean來使用構造參數,這個就不說了。 我們上面的bean配置對應的實際代碼就應該是:

……
public static Object getBean()
{
   return "hello world";
}
……

那麼spring在實例化ID為bean_string的bean時,就會使用TestFactory的 getBean()方法來獲取,而且TestFactory是沒有被實例化的,即是使用靜態方法 來獲取的。對於實例工廠模式的話,我們的配置和上面就稍微有點不一樣了,那 我們就應該配置兩個bean, 一個是實例的工廠bean,還一個就是我們要獲取的 bean的配置了,如下:

<bean id="bean_factory" class="cn.qtone.test.TestBeanFactory"/>

<bean id="bean_helloWorld" factory-bean="bean_factory" factory-method="getHello"/>

上面的配置中,spring容器將首先實例化一個TestBeanFactory,然後再根據 該類的方法getHello來獲取一個bean的實例,我們這裡以HelloWorld對象為例, 對應的代碼就應該如下:

……
public HelloWorld getHello()
{
   return new HelloWorld();
}
……

注意到,我們這裡的getHello方法並不是靜態方法,而是實例方法,所以必 須先實例化TestBeanFactory後才能夠調用。

上面說的都是如何去實例化一個bean,沒有說到bean的屬性注入。雖然我們 也可以通過構造的時候進行一次注入,但這樣做不僅失去了靈活性,而且一長串 的構造參數看著也眼疼哈,呵呵。當然,有一種情況下,我們是應該使用構造注 入的,就是希望注入的對象不能夠被外界修改時,我們這時候就必須使用構造注 入了。對於bean的屬性注入,以HelloWorld為例,我們可以簡單的配置如下:

 

<bean id="bean_test" class="cn.qtone.test.HelloWorld">
   <property name="hello" value="你好!" />
   <property name="world" value="世界" />
   <property name="date" ref="bean_date" />
</bean>

上面的配置中使用了三個屬性注入,即spring中的setter注入方式。注意第 三個屬性,使用了ref,表明這個date屬性的設置參數是關聯到ID為bean_date的 bean上去的。注意在使用setter注入的時候,屬性的名稱不是方法的全名稱,而 是滿足javaBean規范的命名方式,即如果屬性名稱為xxx,那麼其對應的方法名 稱就應該是:setXxx(),注意的是除了xxx中第一個字符不區分大小寫之外,其 他的是要嚴格區分的。那麼對照上面的配置,我們的HelloWorld的方法就應該如 下:

……
public void setHello(String hello)
{
   ……
}
public void setWorld(String world)
{
   ……
}
public void setDate(Date date)
{
   ……
}
……

使用setter注入的好處就是可以很清晰的知道每一個注入的是什麼參數和意 義,通過名稱就可以很容易的看出來,這也是spring提倡使用setter注入的原因 之一。

今天就簡單的說下spring的bean的基礎配置,包括bean的實例化和屬性的注 入等。下次就講下配置中的bean的繼承、抽象等話題。

原文:http://j2ee.blog.sohu.com/63886545.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved