從AOP的角度看,事物跟日志一樣,都是跟業務邏輯無關的東西,這兩個東西通過切入方式,放到系統中,是非常合適的。下面,將Hibernate中的事物配置到Spring中,使我們在編程的時候,無需考慮事物的存在,專心的放到系統的邏輯實現上。
在Spring的配置文件中加入如下配置:
~~~
<!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 配置hibernate的配置文件 -->
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事務管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 配置哪些類的哪些方法使用事務 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.lhc.usermanage.*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
<!-- 配置事務的傳播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
~~~
這里,我們讓Dao層的類繼承HibernateDaoSupport:

這樣就可以簡化CRUD操作。
但是同時也要為UserManagerImpl配置sessionFactory屬性:


除了事物管理器的配置,剩下的配置跟我們使用AOP的動態代理的時候需要的配置內容差不多,主要是定義在哪切開,至于切開之后的內容,當然是加入我們的事物啦。
腦洞大開一下,感覺這時候切入的應該是before跟After的內容。
另外,還有個事物怎么切入的問題,這里就涉及到了事物的傳播特性,比如,我以前有個事物,我再操作是直接用這個事物我還是另外開一個,and so on.......
補充一句,這時候帶大家寫CRUD方法的時候,就要定義好命名規則,才能在Advice里面匹配到方法名稱,才能加上事物!!!終于體會到約定大于配置了。(不知道理解的準確不?)
Ps,也可以使用注解方式配置事務管理:

又少寫了好多代碼
。。。。。。。好懶。。
- 前言
- Spring簡化配置
- Spring中使用AspectJ實現AOP
- Spring中JDK的動態代理和CGLIB代理的區別
- Spring配置問題——元素 "context:component-scan" 的前綴 "context" 未綁定
- Hibernate中編程式事物的簡單使用
- 使用Spring為Hibernate配置聲明式事物
- Struts2+AJAX獲取json數據
- 中間件概述
- EJB(Enterprise Java Bean)概述
- JBoss 6.1安裝配置問題
- EJB對象的部署及客戶端調用簡單示例
- 有狀態的EJB對象和無狀態的EJB對象
- EJB遠程調用和本地調用
- MyBatis——入門select