項目很小,主體部分也完成的差不多了,但麻雀雖小,五臟具全,我在其中用到了spring的IoC和transaction管理,也用到了簡單的AOP功能,同時使用了spring mvc,下面我對它們做一些總結,也跟和我一樣剛剛踏入spring大門的兄弟們探討探討:
(一)spring IoC探討
先還是談談spring IoC的使用。IoC也就是控制反轉,即由容器來調用你的代碼,而你不用去使用容器的接口,一般都用好萊塢原則來進行形象的比喻。最近在看那本without EJB才知道其實DI(依賴注入)其實只是IoC的一種實現,而DI又分為set注入和constructor注入。更輕量級的IoC容器PicoContainer就是采用constructor注入,spring兩種都支持,但Rod Johnson經過詳細的比較,建議還是一般采用set注入方式。理解set注入,對使用和深入了解spring框架非常重要。
為了做到面向接口編程,我們總是盡量使用接口聲明,但接口是不能new的,如果不使用IoC容器,終歸需要個地方new它的實現類。如Interface a=new InterfaceImpl(),這樣還是在代碼中形成了對實現類的依賴。當然我們可以使用factory模式來將聲明提取到工廠類中,但這樣又形成了對工廠的依賴,而且工廠也會越來越多,不便于管理。于是我們通過配置如
這樣在配置文件中聲明其實現類,就消除了對具體實現類的耦合。而一個類通常需要放置其它類的引用,或者使用從其它配置文件讀出的值,這個時候就是set注入顯示威力的時候了。
< SPAN>bean>這是聲明一個Message對象實例的配置文件,${mail.from}表明是在*.properties文件配置的值,看到這個我們就知道SimpleMailMessage是一個具體類,有一個from的屬性,同時有一個setFrom的公共方法。Spring的ContextLoader在啟動時就會自動創建一個SimpleMailMessage對象的實例,并將mail.from對應的值用set方法注入進去,spring默認會創建Singleton對象。以后碰到需要配置的什么參數,就可以采用這種方式注入,注意.properties文件還是分個類較好,如jdbc.properties配置數據庫訪問參數,mail.properties配置郵件參數(我這也是學的jpetstore的)。
以下配置就是將一個mailSender和一個msg引用注入到一個emailAdvice中去。emailAdvice使用的是他們的接口聲明,然后加上set方法,而不關心它們是用什么實現類。
講一個巧妙使用
有了spring,我們就有了新的選擇。先看下面的配置文件:
為簡單起見,我沒有使用接口,直接定義了一個Auditer類,它有一個List類型的auditers屬性,然后加個set方法。對auditers里面的值,就使用spring支持的list配置方式進行注入。你可以配多個value,contextLoader啟動時就會自動把這些value填入一個ArrayList實現,然后set到auditer類中,你就可以直接使用這個類了。你看,是不是很方便就實現了這個功能,這也從一個方面體現了spring的強大之處。
(二)spring transaction管理探討
說到transaction管理,其實我也沒有太多經驗(項目經驗太少!),以前寫jdbc代碼,就是使用setAutoCommit(false)來實現,要用到JTA來實現跨數據庫的情況還沒碰到過。所以這里就簡單講講如何寫spring配置文件來支持transaction的聲明式配置。
以上配置文件就是定義了一個baseTransactionProxy 對象,它注入一個transactionManager對象,并注入一個transactionAttributes的Properties對象,這個Properties對象的配置就是內配置的內容。transactionManager可以根據你的需要來進行配置,如使用hibernate,可以用
來配置。如果使用JTA就使用
,這里很方便就能切換到另一種transactionManager的實現上去。PROPAGATION_REQUIRED表明會放入當前的事務中,如果沒有就創建一個。Readonly表明此方法只讀,能提高速度,spring還支持隔離級別的配置,具體配置說明,可以看spring的api文檔http://www.springframework.org/docs/api/org/springframework/transaction/TransactionDefinition.html。
有了這個baseTransactionProxy,我們就可以用下面的配置使service層的Fa?ade對象具備事務管理功能了。這里VpnImpl 為一個Fa?ade接口的實現類,它實現對Dao層的代理然后,提供對外的統一接口。好處就是只有一個接口類,對transaction的配置和其它AOP配置都可以針對這個Fa?ade進行,希望詳細了解Fa?ade模式可以參看模式相關書籍。
有了spring的transaction管理,聲明式事務就不再是EJB所獨有了,我們可以使用spring的事務,而避免僅僅因為要聲明式事務而使用EJB這樣重量級的東西了。
先寫到這里吧,下篇我再繼續AOP和spring mvc的討論。
posted on 2005-11-07 16:02 pesome 閱讀(2559) 評論(0) 編輯 收藏 所屬分類: Spring+Struts+Hibernate
Powered by: BlogJava Copyright © pesome