返回顶部
首页 > 资讯 > 后端开发 > Python >通过AOP环绕通知如何实现事务控制
  • 947
分享到

通过AOP环绕通知如何实现事务控制

2024-04-02 19:04:59 947人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录通过aop环绕通知实现事务控制1、导入相关的依赖2、配置连接池和开启AOP注解2、创建链接工具类3、AOP环绕事务类spring AOP 环绕通知的思路1、设计一个接口2、编写这

通过AOP环绕通知实现事务控制

1、导入相关的依赖


<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配置方式,当然也可以使用纯注解配置


<!-- 配置数据源 -->
<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、创建链接工具类


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;
    
    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环绕事务类


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;
  
    @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、设计一个接口


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

2、编写这个接口的实现


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中就完成了所有的工作,测试代码与前面的相同,可以看到结果也与前面的相同。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 通过AOP环绕通知如何实现事务控制

本文链接: https://lsjlt.com/news/134818.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 通过AOP环绕通知如何实现事务控制
    目录通过AOP环绕通知实现事务控制1、导入相关的依赖2、配置连接池和开启AOP注解2、创建链接工具类3、AOP环绕事务类spring AOP 环绕通知的思路1、设计一个接口2、编写这...
    99+
    2024-04-02
  • Spring框架基于注解的AOP之各种通知的使用与环绕通知实现详解
    目录一、基于注解的AOP之各种通知的使用二、基于注解的AOP之环绕通知一、基于注解的AOP之各种通知的使用 1.在切面中,需要通过指定的注解将方法标识为通知方法 @Before:前置...
    99+
    2022-11-13
    Spring框架基于注解的AOP各种通知 Spring框架基于注解的AOP环绕通知
  • 基于 Spring Aop 环绕通知实现 Redis 缓存双删功能(示例代码)
    基于 spring aop 常规应用场景多是用于日志记录以及实现 Redis 分布式锁,在 github 中也有项目是把它拿来当作缓存的异常捕捉。从而避免影响实际业务的开发;在某天,笔者有个业务开发是给某个服务模块增加 ...
    99+
    2022-08-16
    Spring Aop Redis 缓存双删 Spring Aop Redis 缓存
  • Spring aop 如何通过获取代理对象实现事务切换
    Spring aop 获取代理对象实现事务切换 在项目中,涉及到同一个类中一个方法调用另外一个方法,并且两个方法的事务不相关, 这里面涉及到一个事务切换的问题,一般的方法没问题,根据...
    99+
    2024-04-02
  • 如何通过PHP控制JavaScript实现页面跳转
    在网页开发中,我们经常需要在页面中添加跳转链接。常见的方式是使用HTML中的标签来实现跳转。另一种方式是通过JavaScript实现。不过,如果我们需要在后台PHP中控制跳转链接,该怎么办呢?本文将介绍如何通过PHP控制JavaScript...
    99+
    2023-05-14
    php javascript 跳转页面
  • 通过Python实现控制手机详解
    几天前我在考虑使用 python 从 whatsapp 发送消息。和你们一样,我开始潜伏在互联网上寻找一些解决方案并找到了关于twilio. 一开始,是一个不错的解决方案,但它不是...
    99+
    2024-04-02
  • Spring aop怎么通过获取代理对象实现事务切换
    这篇文章主要介绍“Spring aop怎么通过获取代理对象实现事务切换”,在日常操作中,相信很多人在Spring aop怎么通过获取代理对象实现事务切换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Sprin...
    99+
    2023-06-20
  • 如何通过VNC实现公网远程控制macOS设备
    公网远程控制macOS【使用mac自带VNC】 文章目录 公网远程控制macOS【使用mac自带VNC】前言1. 测试局域网内远程控制1.1 macOS打开屏幕共享1.2 测试局域网内VNC远...
    99+
    2023-10-28
    macos
  • 通过PHP的while循环语句实现条件判断与循环控制
    标题:利用PHP的while循环语句实现条件判断与循环控制 在PHP编程中,while循环语句是一种常用的循环结构,它可以通过条件判断实现循环控制,使得程序能够根据特定的条件重复执行某...
    99+
    2024-03-08
    php while循环 条件控制
  • mysql如何通过SSL实现主从复制
    下文主要给大家带来mysql如何通过SSL实现主从复制,希望这些内容能够带给大家实际用处,这也是我编辑mysql如何通过SSL实现主从复制这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。实验环境:n...
    99+
    2024-04-02
  • 怎么通过PHP控制JavaScript实现页面跳转
    本文小编为大家详细介绍“怎么通过PHP控制JavaScript实现页面跳转”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么通过PHP控制JavaScript实现页面跳转”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-07-05
  • 如何通过python-turtle库实现绘制图画
    这篇文章给大家分享的是有关如何通过python-turtle库实现绘制图画的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 图1第一个图是蚊香,感兴趣的小伙伴可以自己尝试在python中用turtle库绘制一下。...
    99+
    2023-06-22
  • 如何通过SQL语句在MongoDB中实现事务处理?
    如何通过SQL语句在MongoDB中实现事务处理?摘要:作为一种非关系型数据库,MongoDB一直以其高性能和可扩展性而闻名。然而,对于需要进行事务处理的应用程序而言,MongoDB在较早的版本中并不支持事务功能。不过,从MongoDB 4...
    99+
    2023-12-17
    MongoDB 事务处理 SQL语句
  • 如何实现html5桌面通知
    这篇文章主要讲解了“如何实现html5桌面通知”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现html5桌面通知”吧!html5桌面通知(Web No...
    99+
    2024-04-02
  • php如何实现商品通知
    这篇文章主要介绍“php如何实现商品通知”,在日常操作中,相信很多人在php如何实现商品通知问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何实现商品通知”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-22
  • php异步通知如何实现
    这篇文章主要介绍“php异步通知如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php异步通知如何实现”文章能帮助大家解决问题。PHP异步通知是指通过异步方式与另一个系统进行通信并实现数据的实...
    99+
    2023-07-05
  • 如何通过 Beta 版立即在 Mac 和 iPad 上获得通用控制
    要求除了运行 macOS Monterey 12.3 或更新版本以及 iPadOS 15.4 或更新版本之外,您还需要更新的 Mac(任何 2016 或更新的 MacBook Pro,或 2018 或更新的 MacBook Air、Mini...
    99+
    2023-07-10
  • 如何通过动态参数实现周报制作
    需求描述在货品交易系统里,用户不仅要看当天的交易情况,还需要查看一周 / 一个月 / 一年的情况,也叫做周报 / 月报 / 年报。下图所示就是其中订货信息周报的效果。它是如何根据用户输入的一个日期查询出该日期所在周的订货信息表的呢?实现步骤...
    99+
    2023-06-02
  • 如何通过AmazonAurora实现数据库的版本控制和回滚操作
    Amazon Aurora并不直接支持数据库的版本控制和回滚操作。但您可以通过以下方式实现版本控制和回滚操作: 使用AWS Dat...
    99+
    2024-04-02
  • python如何通过protobuf实现rpc
    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc。rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行goog...
    99+
    2022-06-04
    python protobuf rpc
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作