一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 通過AOP環繞通知如何實現事務控制

通過AOP環繞通知如何實現事務控制

2021-12-21 13:51怪咖軟妹@ Java教程

這篇文章主要介紹了通過AOP環繞通知如何實現事務控制的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

通過AOP環繞通知實現事務控制

1、導入相關的依賴

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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配置方式,當然也可以使用純注解配置

?
1
2
3
4
5
6
7
8
9
10
<!-- 配置數據源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <!--連接數據庫的必備信息-->
    <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、創建鏈接工具類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.gzl.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.sql.Connection;
/**
 * 連接的工具類,它用于從數據源中獲取一個連接,并且實現和線程的綁定
 */
@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.從數據源中獲取一個連接,并且存入ThreadLocal中
                conn = dataSource.getConnection();
                tl.set(conn);
            }
            //4.返回當前線程上的連接
            return conn;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
    /**
     * 把連接和線程解綁
     */
    public void removeConnection(){
        tl.remove();
    }
}

3、AOP環繞事務類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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;
/**
 * 和事務管理相關的工具類,它包含了,開啟事務,提交事務,回滾事務和釋放連接
 */
@Component("txManager")
@Aspect
public class TransactionManager {
    @Autowired
    private ConnectionUtils connectionUtils;
  /**
     * 需要進行事務控制的類或者方法,EL表達式配置
     */
    @Pointcut("execution(* com.gzl.service.impl.*.*(..))")
    private void pt1(){}
    /**
     * 開啟事務
     */
    public  void beginTransaction(){
        try {
            connectionUtils.getThreadConnection().setAutoCommit(false);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 提交事務
     */
    public  void commit(){
        try {
            connectionUtils.getThreadConnection().commit();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 回滾事務
     */
    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.獲取參數
            Object[] args = pjp.getArgs();
            //2.開啟事務
            this.beginTransaction();
            //3.執行方法
            rtValue = pjp.proceed(args);
            //4.提交事務
            this.commit();
            //返回結果
            return  rtValue;
        }catch (Throwable e){
            //5.回滾事務
            this.rollback();
            throw new RuntimeException(e);
        }finally {
            //6.釋放資源
            this.release();
        }
    }
}

spring AOP 環繞通知的思路

環繞通知Around Advice就是在指定的程序前后均執行相關的服務,設計思路如下:

1、設計一個接口

?
1
2
3
4
5
6
package com.spring.service;
public interface IComponent {
public void bussiness1();
public void bussiness2();
public void bussiness3();
}

2、編寫這個接口的實現

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.spring.service;
public class Component implements IComponent{
 @Override
 public void bussiness1() {
  // TODO Auto-generated method stub
  System.out.println("這是業務1");
 }
 @Override
 public void bussiness2() {
  // TODO Auto-generated method stub
  System.out.println("這是業務2");
 }
 @Override
 public void bussiness3() {
  // TODO Auto-generated method stub
  System.out.println("這是業務3");
 }
}

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

該代碼必須實現org.aopalliance.intercept.Method Interceptor接口,需要的服務都寫在這里。

4、編寫XML配置文件

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

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

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

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/weixin_43888891/article/details/109323679

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 国产精品午夜性视频网站 | 手机看片国产免费久久网 | 无限在线观看视频大全免费高清 | 美女的隐私无遮挡的网页 | 午夜五月天 | 成人精品亚洲 | 国产精品久久久久久久久久久久 | 奇米影视中文字幕 | 美女污视频在线观看 | 国产精品探花一区在线观看 | 日韩一区二区三区精品 | 国产一区在线免费观看 | 国产清纯91天堂在线观看 | 农村老少伦小说 | 免费观看美女被cao视频 | 午夜AV国产欧美亚洲高清在线 | 亚洲成综合人影院在院播放 | 国产一页 | 69p69国产精品| 成人男女啪啪免费观看网站 | 亚洲精品成人AV在线观看爽翻 | 91李宗精品72集在线观看 | 日本妇人成熟免费观看18 | 成人免费毛片一区二区三区 | 精品国产一区二区三区国产馆 | 好大好猛好爽好深视频免费 | 日韩在线免费 | 国内精品久久久久小说网 | 日本aaa大片| 国外欧美一区另类中文字幕 | 美女扒开两腿露出尿口的视频 | 亚洲成在人网站天堂一区二区 | 午夜小视频免费观看 | 国产一二区视频 | 国产18在线| 美女污视频在线观看 | 天天操天天干天天 | 国产成人+亚洲欧洲 | 50度灰破解版v5.7.0 | 亚洲免费黄色网 | 久久天天躁狠狠躁夜夜躁 |