2013年1月20日 星期日

spring aop + transaction 控制

整個aop的目的在於 : 如果你會一直寫一樣的東西,那就抽出來,用動態的方式安插在需要的地方即可。

交易是在aop 中一定會被提及的部份,除非你的程式都是單純的報表查詢,否則交易需求是一定會被提到。

在這裡透過aop + annotation 可以超簡單的達成。

spring的xml中要有這幾樣東西。


  1. <context:annotation-config />
  2. <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  3.         <property name="sessionFactory" ref="sessionFactory"></property>
  4.  </bean>
  5.  <tx:annotation-driven transaction-manager="transactionManager" />

最後一行是說,我要用過annotation的方式來設定transaction。如果不加這一行是無法達成用anno 的方式來設定。

(sessionFactory我假設你已經設定好了…)

再來,只要在你想要做交易的地方宣告@transactional即可。


  1.      @Transactional
  2.      public class UserService {
  3.        @Reso urce
  4.         private UsersDAO userDao;
  5.        
  6.        @Transactional
  7.         public List<Users> list() {
  8.             userDao.addUserErrorTest();
  9.             return userDao.listAll();
  10.         }
  11.         public void testInsertError(){
  12.            
  13.         }
  14. }


我userDao裡的這個方法,會故意新增一個成功,另一個失敗,當這樣宣告的時候,此方法裡呼叫的程式將會被視為一次交易,要就是全部成功,否則就是全部失敗。

aop + transaction的顆粒度極限是方法。所以在dao某個方法中,要重新思考,若不需要交易的程式區塊,要再重構出新的方法,畢竟交易是需要佔時間與資源的。

以下補充一下sessionFactory 的設定方式,我的範例是以 jndi 的方式來做。


  1. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  2.         <property name="dataSource" ref="dataSource" />
  3.         <property name="hibernateProperties">
  4.             <value>
  5.             hibernate.dialect=org.hibernate.dialect.SQLServerDialect
  6.               hibernate.show_sql=true
  7.             </value>
  8.         </property>
  9.         <property name="annotatedClasses">
  10.             <list>
  11.                 <value>entity.Users</value>
  12.             </list>
  13.         </property>
  14.     </bean>
  15.     <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  16.         <property name="jndiName" value="java:comp/env/jdbc/deu"></property>
  17.     </bean>

沒有留言:

張貼留言