最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過AOP環(huán)繞通知如何實現(xiàn)事務(wù)控制

 更新時間:2021年09月07日 08:40:56   作者:怪咖軟妹@  
這篇文章主要介紹了通過AOP環(huán)繞通知如何實現(xiàn)事務(wù)控制的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

通過AOP環(huán)繞通知實現(xiàn)事務(wù)控制

1、導(dǎo)入相關(guān)的依賴

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
         <groupId>c3p0</groupId>
         <artifactId>c3p0</artifactId>
         <version>0.9.1.2</version>
     </dependency>
     <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.8.7</version>
      </dependency>
</dependencies>

2、配置連接池和開啟AOP注解

以下采用的是xml配置方式,當然也可以使用純注解配置

<!-- 配置數(shù)據(jù)源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <!--連接數(shù)據(jù)庫的必備信息-->
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
    <property name="user" value="root"></property>
    <property name="password" value="root"></property>
</bean>
<!--開啟spring對注解AOP的支持-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

2、創(chuàng)建鏈接工具類

package com.gzl.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.sql.Connection;
/**
 * 連接的工具類,它用于從數(shù)據(jù)源中獲取一個連接,并且實現(xiàn)和線程的綁定
 */
@Component("connectionUtils")
public class ConnectionUtils {
    private ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    @Autowired
    private DataSource dataSource;
    /**
     * 獲取當前線程上的連接
     * @return
     */
    public Connection getThreadConnection() {
        try{
            //1.先從ThreadLocal上獲取
            Connection conn = tl.get();
            //2.判斷當前線程上是否有連接
            if (conn == null) {
                //3.從數(shù)據(jù)源中獲取一個連接,并且存入ThreadLocal中
                conn = dataSource.getConnection();
                tl.set(conn);
            }
            //4.返回當前線程上的連接
            return conn;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
    /**
     * 把連接和線程解綁
     */
    public void removeConnection(){
        tl.remove();
    }
}

3、AOP環(huán)繞事務(wù)類

package com.gzl.utils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * 和事務(wù)管理相關(guān)的工具類,它包含了,開啟事務(wù),提交事務(wù),回滾事務(wù)和釋放連接
 */
@Component("txManager")
@Aspect
public class TransactionManager {
    @Autowired
    private ConnectionUtils connectionUtils;
  /**
     * 需要進行事務(wù)控制的類或者方法,EL表達式配置
     */
    @Pointcut("execution(* com.gzl.service.impl.*.*(..))")
    private void pt1(){}
    /**
     * 開啟事務(wù)
     */
    public  void beginTransaction(){
        try {
            connectionUtils.getThreadConnection().setAutoCommit(false);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 提交事務(wù)
     */
    public  void commit(){
        try {
            connectionUtils.getThreadConnection().commit();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 回滾事務(wù)
     */
    public  void rollback(){
        try {
            connectionUtils.getThreadConnection().rollback();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 釋放連接
     */
    public  void release(){
        try {
            connectionUtils.getThreadConnection().close();//還回連接池中
            connectionUtils.removeConnection();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @Around("pt1()")
    public Object aroundAdvice(ProceedingJoinPoint pjp){
        Object rtValue = null;
        try {
            //1.獲取參數(shù)
            Object[] args = pjp.getArgs();
            //2.開啟事務(wù)
            this.beginTransaction();
            //3.執(zhí)行方法
            rtValue = pjp.proceed(args);
            //4.提交事務(wù)
            this.commit();
            //返回結(jié)果
            return  rtValue;
        }catch (Throwable e){
            //5.回滾事務(wù)
            this.rollback();
            throw new RuntimeException(e);
        }finally {
            //6.釋放資源
            this.release();
        }
    }
}

spring AOP 環(huán)繞通知的思路

環(huán)繞通知Around Advice就是在指定的程序前后均執(zhí)行相關(guān)的服務(wù),設(shè)計思路如下:

1、設(shè)計一個接口

package com.spring.service;
public interface IComponent { 
public void bussiness1();
public void bussiness2();
public void bussiness3();
}

2、編寫這個接口的實現(xiàn)

package com.spring.service;
public class Component implements IComponent{
 @Override
 public void bussiness1() {
  // TODO Auto-generated method stub
  System.out.println("這是業(yè)務(wù)1");
 }
 @Override
 public void bussiness2() {
  // TODO Auto-generated method stub
  System.out.println("這是業(yè)務(wù)2");
 }
 @Override
 public void bussiness3() {
  // TODO Auto-generated method stub
  System.out.println("這是業(yè)務(wù)3");
 }
}

3、編寫前置通知的邏輯代碼

該代碼必須實現(xiàn)org.aopalliance.intercept.Method Interceptor接口,需要的服務(wù)都寫在這里。

4、編寫XML配置文件

通過代理來實現(xiàn)AOP的環(huán)繞通知,看一下org.aopalliance.intercept.MethodInterceptor接口的源代碼。該接口不是Spring內(nèi)部的接口,而是AOP Alliance標準所指定的,不過Spring對這個接口有一個具體的實現(xiàn)過程,同時該接口相融所有遵守AOP Alliance標準的所有AOP框架。

環(huán)繞通知相當于前置通知和后置通知的結(jié)合,不同的是在MethodInterceptor的invoke()方法中,可以自由地使用MethodInvocation提供的proceed()方法來執(zhí)行目標對象的方法,同時proceed()方法將會返回目標方法執(zhí)行后的返回結(jié)果,在invoke方法結(jié)束前還可以修改該結(jié)果,下面還是以上面的那個例子來示范一下環(huán)繞通知的應(yīng)用。

編寫一個環(huán)繞通知的類,該類實現(xiàn)MethodInterceptor接口。這里調(diào)用了MethodInvocation的proceed()方法,也就是說,調(diào)用了目標對象Component中的business1等方法,在這個方法的前后分別增加了驗證和通知執(zhí)行,接著修改一下配置文件,去掉前置通知和后置通知的配置,只需要將這個環(huán)繞通知添加進去就可以了,具體代碼如下:

這里只需要配置一個環(huán)繞通知的Bean,并且將這個Bean配置到interceptorNames中就完成了所有的工作,測試代碼與前面的相同,可以看到結(jié)果也與前面的相同。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java如何優(yōu)雅地書寫if-else

    詳解Java如何優(yōu)雅地書寫if-else

    在日常開發(fā)中我們常常遇到有多個if?else的情況,之間書寫顯得代碼冗余難看,對于追求更高質(zhì)量代碼的同學(xué),就會思考如何優(yōu)雅地處理這種代碼。本文我們就來探討下幾種優(yōu)化if?else的方法
    2022-08-08
  • Java大數(shù)運算BigInteger與進制轉(zhuǎn)換詳解

    Java大數(shù)運算BigInteger與進制轉(zhuǎn)換詳解

    這篇文章主要介紹了Java大數(shù)運算BigInteger與進制轉(zhuǎn)換詳解,Java 提供了 BigInteger(大整數(shù))類和 BigDecimal(大浮點數(shù))類用于大數(shù)運算,這兩個類都繼承自 Number 類(抽象類),由于 BigInteger 在大數(shù)運算中更常見,需要的朋友可以參考下
    2023-09-09
  • java實現(xiàn)人工智能化屏幕監(jiān)控窗口

    java實現(xiàn)人工智能化屏幕監(jiān)控窗口

    這篇文章主要為大家詳細介紹了java實現(xiàn)人工智能化屏幕監(jiān)控窗口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • java后端如何調(diào)用第三方接口(往header和body中的參數(shù)傳參)

    java后端如何調(diào)用第三方接口(往header和body中的參數(shù)傳參)

    這篇文章主要介紹了java后端如何調(diào)用第三方接口(往header和body中的參數(shù)傳參),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 深入了解MyBatis分頁機制

    深入了解MyBatis分頁機制

    在企業(yè)項目的數(shù)據(jù)庫操作中,分頁查詢是一個常見需求,尤其當數(shù)據(jù)量龐大時,MyBatis作為我們Java開發(fā)者的持久層框架,為分頁提供了靈活的支持,本篇文章我們將深入探討MyBatis的分頁機制,使我們在實際開發(fā)項目中運用自如,需要的朋友可以參考下
    2023-12-12
  • 最新評論

    资溪县| 武清区| 尖扎县| 五寨县| 汕尾市| 宁都县| 石泉县| 雅安市| 忻州市| 黔西| 贵州省| 麟游县| 宿州市| 彭州市| 通海县| 乌拉特前旗| 聂荣县| 宁蒗| 隆德县| 江孜县| 波密县| 梅州市| 广宁县| 伊宁市| 新沂市| 孙吴县| 黄浦区| 霍邱县| 类乌齐县| 砚山县| 花垣县| 五常市| 临夏市| 乐山市| 青浦区| 聂荣县| 沾化县| 镇康县| 越西县| 钟祥市| 山阴县|