實例中涉及的配置文件有這么幾個
applicationContext.xml
jdbc.properties
log4j.properties
struts.xml
我準(zhǔn)備在本章中只講applicationContext.xml、jdbc.properties和web.xml。log4j的配置大同小異而且也不在本文范圍。至于struts.xml我準(zhǔn)備留到后面與Action代碼一起來講,因為用的是struts2-convention-plugin插件來實現(xiàn)struts2的注解,所以這兩個結(jié)合起來講要好一些。
第二部分:分析配置文件
1、jdbc.properties
本例采用MySQL數(shù)據(jù)庫,所以我設(shè)置了一個屬性文件,用來存放一些連接信息和Hibernate相關(guān)的設(shè)置。

因為我們使用的是Hibernate來與數(shù)據(jù)庫進行交互,把這些東西寫在單獨的文件里,是方便修改,如果你想換成SQL Server或是Oracle,只需要更改driver、url以及dialect,而且還可以自由控制sql語句的顯示的開關(guān),非常方便。至于寫在這里怎么用呢?請接著看下面的applicationContext.xml說明。
2、applicationContext.xml
這個文件就是spring的主配置文件了,當(dāng)然,本例也只有這么一個spring的配置文件,內(nèi)容不多,但做的工作還是很多的,下面我給大家詳細(xì)分析一下。

我把這兩部分放在一起是因為這兩者是相互聯(lián)系的,而且也比較好說明??梢赃@樣來理解,PropertyPlaceholderConfigurer這個類就是讀取jdbc. properties文件,并將它們設(shè)置到這個類的屬性中。然后再將下面數(shù)據(jù)源配置中定義的這些${jdbc.driver}、${jdbc.url}字符串換成屬性文件中相同名稱的值。${}這種寫法,是類里面方法解析用的,網(wǎng)上都說這是叫占位符,我看了源代碼的,其實是把它們當(dāng)成字符串截取前后的特殊字符,再根據(jù)里面定義的名稱找屬性文件中對應(yīng)的值。所以這個類只能讀取properties格式的文件,你如果還有其它需要加入的屬性文件,可以在list之間加入,寫在value標(biāo)簽里面。

根據(jù)base-package指定的路徑,掃描其下所有包含注解的Bean,并自動注入。比如@Repository,@Service這些都是注解,前者表示持久層,后者表示業(yè)務(wù)層。這可是非常非常好的一個功能,是從Spring2.5開始加入的一個非常棒的特性。有了它,我們將不用再去寫那繁瑣的<bean id="" class="" />。本文的主旨就是全注解,就是為了告訴大家不用寫配置文件(當(dāng)然不是絕對不寫)來怎樣進行開發(fā)工作。關(guān)于這部分的具體情況,在后面代碼章節(jié)中會詳細(xì)講解。

這就是在Spring中定義Hibernate相關(guān)的配置,Spring已經(jīng)集成了這部分功能。通過class里面定義的類名稱我們很容易就能理解,這是使用注解的方式映射實體以及創(chuàng)建Hiberante SessionFactory。${hibernate.dialect}、${hibernate.show_sql}和上面的數(shù)據(jù)源配置獲取方式一樣,當(dāng)applicationContext.xml定義好之后,就不用再對它進行修改,而是將修改對象變成了jdbc.properties文件。
另外在Spring

這是事務(wù)定義,而且是使用注解方式定義事務(wù)(@Transactional),proxy-target-class="true"表示采用動態(tài)代理類來管理事務(wù),如果是false表示采用接口代理來管理事務(wù)(默認(rèn)值為false)。什么意思呢?就是說對于需要加入事務(wù)處理的類,如果是實現(xiàn)接口,那么將采用Spring的默認(rèn)事務(wù)管理(Spring默認(rèn)方式為接口),如果不采用接口,而直接使用類,那么就需要cglib類庫的支持,它通過動態(tài)的創(chuàng)建目標(biāo)類(就是你需要加入事務(wù)的類)的子類,然后對這子類中的方法(當(dāng)然是從目標(biāo)類中繼承來的)進行事務(wù)管理。這其實就是AOP切面,而且從中可以看出來,需要加入事務(wù)的方法不能為private、static、final 的方法。這樣說也不是很嚴(yán)格,說它不能加入事務(wù),是說它不能主動的啟動一個事務(wù),如果某個private方法是被某個public方法調(diào)用的,而public方法是可以被動態(tài)代理加入事務(wù)的,所以這個private方法也一樣被加入了事務(wù),只是它處在public方法的事務(wù)之中。但是static和final這兩類方法因為不能被子類覆蓋,所以無法加入事務(wù)。如果這兩類型的方法不被其它的事務(wù)方法所調(diào)用,那么它們就會以無事務(wù)的方式運行,因此很容易造成隱患,這一點請大家特別注意。

上面這個就是使用配置式來定義事務(wù),兩種方式的區(qū)別主要是,注解式只用寫那么一句話,然后在業(yè)務(wù)類或方法中加入@Transactional這個注解標(biāo)記,就完成事務(wù)聲明,不過對于每個業(yè)務(wù)類都需要在類或方法中加入這些標(biāo)記。而配置式聲明,就是不用加這些標(biāo)記,只要你的方法名稱命名比較統(tǒng)一,就可以像上面這樣定義事務(wù)規(guī)范,然后在aop標(biāo)簽中定義切入點與執(zhí)行通知就行了。我感覺如果業(yè)務(wù)邏輯不是太復(fù)雜的情況,配置式會比較簡單,而且修改起來也方便,這兩種方式我都寫出來了,至于用哪一種,由你們自己決定。
3、web.xml
現(xiàn)在使用的Servlet容器還是2.4版,因此web.xml里面還是需要寫配置文件的,到了3.0版就可以采取注解的方式來實現(xiàn)了。

Spring ApplicationContext配置文件的路徑,可使用通配符,applicationContext*.xml表示所有以applicationContext開頭的xml文件。多個路徑用,號分隔。比如可以這樣寫:

不過推薦采用通配符的寫法,能夠簡單點,為什么還要弄那么復(fù)雜呢?
context-param是在容器啟動后最先被執(zhí)行的,并且被放入到容器上下文中。在這里引入spring的配置文件,是供Spring的ContextLoaderListener監(jiān)聽器使用。而這個監(jiān)聽器中會有一個ContextLoade類用來獲取這個配置文件中的信息。從而進行Spring容器的初始化工作。因為是采用注解的方式來進行開發(fā),所以spring的配置文件其實只有一個,上面那個星號可以去掉。

這個監(jiān)聽器就是為了讀取Spring的配置文件,這在上面已經(jīng)講到了。

這是Spring提供的一個用來防止內(nèi)存泄漏的監(jiān)聽器。在我們使用struts2框架,或其它的某些類庫時,因為它們自身的設(shè)計,會用到Introspector(內(nèi)?。C制來獲取Bean對象的信息。但不幸的是,這些框架或類庫在分析完一個類之后卻沒有將它從內(nèi)存中清除掉,內(nèi)存中還保留有大量的靜態(tài)資源,而這些東西又無法進行垃圾回收,因此產(chǎn)生了很嚴(yán)重的內(nèi)存泄漏問題。直接表現(xiàn)為服務(wù)器的內(nèi)存使用會隨著時間而不斷上升,最后的結(jié)果當(dāng)然就是服務(wù)器當(dāng)?shù)?。所以在這里加入此監(jiān)聽器,能夠幫助我們更好的處理內(nèi)存資源回收的問題。

這是Spring的編碼過濾器,我們可以直接拿來用,相信這段配置應(yīng)該很好理解,不過請大家注意forceEncoding這個參數(shù),把它設(shè)置為true表示不管請求中的編碼是什么格式,都將強制采用encoding中設(shè)置的編碼方式。另外對于響應(yīng)也將按照encoding指定的編碼進行設(shè)置。另外不建議將編碼設(shè)置成gb2312或是gbk格式,請采用基于Unicode的UTF-8編碼。

這個過濾器是個好東西,有了它,我們在使用Hibernate延遲加載的時候,就不會再為因Session被關(guān)閉,導(dǎo)致延遲加載數(shù)據(jù)異常而頭痛了。網(wǎng)上有很多人說這個不好,其實在使用中,效果還是不錯的。

首先我要說這個過濾器的名字很雷,不知道寫這類的家伙是不是個變態(tài),或者喜歡惡搞。主要原因就是,這個過濾器的功能是推遲清理值棧中的值,以便在web層中進行訪問,另外就是為了配合SiteMesh裝飾器進行工作(官方中的說明)。如果不加這個,那么Struts2的默認(rèn)過濾器就會清空值棧中的值,這樣就會導(dǎo)致異常。所以說這類的名字和功能完全不搭邊,很容易讓人產(chǎn)生誤解。

在
web.xml里面的幾個重要的配置就這些,不過不要忘了,給這些filter加上filter-mapping映射。還有一點,請注意這些過濾器的順序,這個順序是很重要的,程序運行時,是根據(jù)這些filter-mapping的排列順序依次執(zhí)行過濾操作的。如果不想出現(xiàn)莫名其妙的錯誤,請控制好這些過濾器映射的順序。
我會在最后一章附上源碼,大家就這樣慢慢看吧。看到最后一章的時候,可能這些相關(guān)的知識就比較清楚了。到時再對照源碼練習(xí)下,應(yīng)該會有一些收獲。恩,這部分就到此結(jié)束了,我們下次繼續(xù)。
本文為菠蘿大象原創(chuàng),如要轉(zhuǎn)載請注明出處。http://www.aygfsteel.com/bolo