1. 程式人生 > >Spring框架的事務管理之基於AspectJ的XML方式(重點掌握)

Spring框架的事務管理之基於AspectJ的XML方式(重點掌握)

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.