Spring框架的事務管理之基於AspectJ的XML方式(重點掌握)
阿新 • • 發佈:2018-12-18
1. 步驟一:恢復轉賬開發環境(轉賬開發環境見“
https://www.cnblogs.com/wyhluckdog/p/10137283.html”)
2.
步驟二:引入AOP的開發包
3.步驟三:引入applicationContext.xml配置檔案* 配置檔案的基本配置為:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>
* 管理C3P0連線池
* 先引入C3P0的jar包 * com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar * 編寫配置檔案 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql:///spring_day03"/> <property name="user" value="root"/> <property name="password" value="root"/> </bean>
4.步驟四:建立對應的包結構和類(具體內容見
“
https://www.cnblogs.com/wyhluckdog/p/10137283.html”
)
* com.huida.demo1 * AccountService * AccountServlceImpl * AccountDao * AccountDaoImpl
5.步驟五:引入Spring的配置檔案,將類配置到Spring中
<bean id="accountDao" class="com.huida.demo1.AccountDaoImpl"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="accountService" class="com.huida.demo1.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> </bean>
6.
步驟六:配置事務管理器
<!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
7.
步驟七:配置事務增強
<!-- 配置事務增強 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- name :繫結事務的方法名,可以使用萬用字元,可以配置多個。 propagation :傳播行為 isolation :隔離級別 read-only :是否只讀 timeout :超時資訊 rollback-for:發生哪些異常回滾. no-rollback-for:發生哪些異常不回滾. --> <!-- 哪些方法加事務 --> <tx:method name="pay" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
8.步驟八:書寫切面類MyAdvice:
package com.huida.demo1; public class MyAdvice { public void log(){ System.out.println("新增日誌"); } }
9.步驟九:配置AOP的切面
<bean id="myAdvice" class="com.huida.demo1.MyAdvice"></bean>
<aop:config> <aop:aspect ref="myAdvice"> <aop:before method="log" pointcut="execution(* com.huida.demo1.AccountServiceImpl.pay(..))"/> </aop:aspect> </aop:config>
10.完整的配置檔案的配置資訊為:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql:///spring-day03"/> <property name="user" value="root"/> <property name="password" value="root"/> </bean> <!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 配置事務增強 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="pay" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <bean id="myAdvice" class="com.huida.demo1.MyAdvice"></bean> <aop:config> <aop:aspect ref="myAdvice"> <aop:before method="log" pointcut="execution(* com.huida.demo1.AccountServiceImpl.pay(..))"/> </aop:aspect> </aop:config> <bean id="accountDao" class="com.huida.demo1.AccountDaoImpl"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="accountService" class="com.huida.demo1.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> <!-- <property name="transactionTemplate" ref="transactionTemplate"/> --> </bean> </beans>
11.步驟十:編寫測試類
package com.huida.demo1; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Demo1 { @Resource(name="accountService") private AccountService accountService; @Test public void run1(){ accountService.pay("小明","小紅",1000); } }
12.單元測試run1方法,重新整理spring-day03資料庫中的user表,可以看到小明的money減少了1000,而小紅的money增加了1000.