spring:AOP面向切面编程+事务管理

2023-11-20

目录

一、Aop( Aspect Oriented Programming)

二、springAOP实现

1.XML实现

2.注解实现

三、spring事务管理


一、Aop( Aspect Oriented Programming)

        将程序中的非业务代码抽取,使非业务代码与业务代码相隔离,为目标类创建一个代理对象让代理对象调用目标类中的方法也就是非业务代码,提高了代码的复用率和灵活性,提高开发效率,降低了非业务代码与业务代码的耦合性。        

专业名词:

  1. 连接点(Joinpoint):类中可以被增强的方法(新增修改等);
  2. 切入点(pointcut):实际被增强的方法;
  3. 通知(Advice): 一个切面在特定的连接点要做的事情(方法被增强的功能),分为前置通知、后置通知、异常;
  4. 切面(Aspect):把通知添加到切入点的整个过程称为切面;
  5. 目标(Target): 代理的目标对象(连接点,切入点所在类);
  6. 代理(Proxy): 向目标对象应用通知时创建的代理对象。

应用场景:

       保存日志、事务管理、权限控制、统一异常管理、缓存、对象池管理等

二、springAOP实现

示例一个日志通知功能

首先添加spring—aspect jar包:

        <!--aspectj-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

有两种实现方式:XML和注解 

1.XML实现

将通知方法所在的类以XML的方法交给spring管理:

    <bean id="commonUtil" class="com.yyds.spring.util.CommonUtil"></bean>

配置通知和切入点之间的关系:

    <aop:config>
        <!--切入点 实际被蹭强的方法-->
        <aop:pointcut id="allmethods" expression="execution(* com.yyds.spring.dao.*.*(..))"/>
        <!--切面 把通知添加到切入点的整个过程称为切面. -->
        <aop:aspect ref="commonUtil">
            <!--前置通知-->
            <!--<aop:before method="savelog" pointcut-ref="allmethods"></aop:before>-->
            <!--最终通知 ,无论是否有异常,都会通知-->
            <!--<aop:after method="savelog" pointcut-ref="insert"></aop:after>-->
            <!--后置通知,如果有异常,不会通知-->
            <!--<aop:after-returning method="savelog" pointcut-ref="allmethods"></aop:after-returning>-->
            <!--有异常才会通知-->
            <!--<aop:after-throwing method="savelog" pointcut-ref="allmethods"></aop:after-throwing>-->

            <!--环绕通知-->
            <aop:around method="savelog" pointcut-ref="allmethods"></aop:around>
        </aop:aspect>
    </aop:config>

表示dao包下的所有类中的方法都可以被增强 

  • before:前置通知
  • after-returning:后置通知,有异常不执行,在方法正常执行完成之后
  • after:最终通知,无论是否有异常,最终都会执行
  • after-throwing:有异常才会通知

环绕通知:around,包含上面所有的分布通知

 环绕示例:

public class CommonUtil_back {

    void savelog(ProceedingJoinPoint proceedingJoinPoint){
        System.out.println("前置通知");
        try {
            System.out.println(new Date()+"日志");
             Object[] objects= proceedingJoinPoint.getArgs();
             System.out.println(Arrays.toString(objects));

            // 调用我们目标的切入点
            proceedingJoinPoint.proceed();

            System.out.println("后置通知");
        }catch (Throwable e){
            System.out.println(e.getMessage()+"异常通知");
        }
        System.out.println("最终通知");
    }
}

JoinPoint和ProceedingJoinPoint: 

ProceedingJoinPoint是JoinPoint的子类;

ProceedingJoinPoint 比 JoinPoint仅仅多 proceed()方法;

尽量在around通知时,使用ProceedingJoinPoint作为参数;

在用其他通知时,使用JoinPoint作为参数。

2.注解实现

      1. 开启springAOP注解方式:<aop:aspectj-autoproxy />

       2. 在通知的类上添加注解:@Component和@Aspect

前置、后置、最终、异常通知 :

    @Before("execution(* com.yyds.spring.dao.*.*(..))")
    @After("execution(* com.yyds.spring.dao.*.*(..))")
    @AfterReturning("execution(* com.yyds.spring.dao.*.*(..))")
    @AfterThrowing(value = "execution(* com.yyds.spring.dao.*.*(..))",throwing = "e")
    void savelog(JoinPoint joinPoint){
            System.out.println(new Date()+"日志");
    }

环绕通知:

    @Around("execution(* com.yyds.spring.dao.*.*(..))")
    void savelog(ProceedingJoinPoint point){
        System.out.println("前置通知");
        try {
            System.out.println(new Date()+"日志");
            Object[] args = point.getArgs();
            System.out.println(Arrays.toString(args));

            point.proceed();


            System.out.println("后置通知");
        }catch (Throwable e){
            System.out.println("异常通知"+e.getMessage());
        }
        System.out.println("最终通知");
    }

环绕通知格式要使用try{ }catch( )形式

三、spring事务管理

        程序在顺序执行过程中,任何一步都可能出现异常,导致后面程序不执行,很有可能使业务逻辑未完成,执行结果并不可靠。例如在转账时,A向B转500r时,若A的余额扣掉500r时,程序中出现异常,导致B的余额并未增加500r,这样就使得程序并为完成转账功能。事务管理的作用就是使这些操作看成一个整体,要么都执行,要么都不执行。保持事务的原子性。

spring可以自动提交和回滚事务

1.编程式:在项目中很少使用,这种方式需要注入一个事务管理对象TransactionTemplate ,然后在我们代码中需要提交事务或回滚事务时自己写代码实现。

2.声明式

        XML配置实现和注解实现

注解实现:

配置事物管理器:

<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

开启注解事务管理 

<!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring:AOP面向切面编程+事务管理 的相关文章

  • spring boot框架下如何过滤tomcat产生的访问日志

    我们使用spring boot框架 通过嵌入式tomcat生成访问日志 访问日志的格式如下 server tomcat access log enabled true server tomcat access log pattern h l
  • Eclipse 说“更新 Android Developer Toolkit”

    我不知何故弄乱了我的 Eclipse 和 Android 设置 我不知道如何修复它 问题症状如下 在 首选项 gt Android 中 我尝试选择 android sdk linux 的位置 选择时出现错误 此 Android SDK 需要
  • com.google.gwt.dev.jjs.InternalCompilerException:访问期间出现意外错误

    我在使用版本 2 6 0 编译 gwt 应用程序时遇到以下错误 最初我用 gwt 版本 2 6 1 的 maven 编译它 然后尝试通过版本 2 6 0 的 eclipse 编译它 跟版本兼容有关系吗 com google gwt dev
  • 使用java在mysql中插入带有\\的文件路径

    我正在使用java制作一个独立的应用程序 并且我需要插入用户从文件选择器中选择的图像的路径 我正在获取文件的路径 但是当我将其存储在数据库 mysql 中时 它不会存储 所以当我检索该路径时 该文件不会显示 如何存储文件的路径 这样就可以使
  • Selenium Webdriver 中显式等待 findElements

    登录后 页面重定向到一个页面 我想等待页面加载 我在其中按 tagName 查找元素 By inputArea By tagName input List
  • Hibernate HQL 查询:如何将集合设置为查询的命名参数?

    给定以下 HQL 查询 FROM Foo WHERE Id id AND Bar IN barList I set id使用查询对象的setInteger 方法 我想设置 barList用一个List对象 但查看 Hibernate 文档和
  • 找不到模块:javafx.controls

    我已经下载了JavaFX SDK 解压它并设置PATH TO FX系统变量 如下本说明 https openjfx io openjfx docs install javafx 我使用了以下代码示例 import javafx applic
  • Maven:缺少工件 org.springframework:spring:jar:4.2.6

    我在 SpringToolSuite 中有一个动态 Web 项目 它被转换为 Maven 项目 我遇到问题 缺少工件 org springframework spring jar 4 2 6 我已经尝试清理 重建和运行该项目 它给 读取文件
  • 使用 viewModel 从 ChildFragment 访问 ParentFragment 中的 ViewModel

    我正在尝试访问ParentViewModel for ParentFragment from ChildFragment using viewModels 这是我的代码 In ParentFragment class ParentFragm
  • 用 Java 捕获扬声器输出

    使用Java可以捕获扬声器输出吗 此输出不是由我的程序生成的 而是由其他正在运行的应用程序生成的 这可以用 Java 完成还是我需要求助于 C C 我有一个基于 Java 的应用程序 使用过的爪哇声音 https stackoverflow
  • 在 jFrame 中启用右键单击

    嘿 我正在寻找如何使用 NetBeans 在 jFrame 中启用 仅且仅 右键单击并显示弹出菜单 使用我的代码 private void formMouseClicked java awt event MouseEvent evt pop
  • Hibernate3:自引用对象

    需要一些帮助来了解如何执行此操作 我将在文件系统上运行递归 查找 并且希望将信息保留在单个数据库表中 具有自引用的层次结构 这是我想要填充的数据库表结构 目录对象表 id int NOT NULL name varchar 255 NOT
  • Java字符串中的字符数[重复]

    这个问题在这里已经有答案了 可能的重复 Java 使用unicode上划线显示平方根时字符串的长度 https stackoverflow com questions 7704426 java length of string when u
  • 如何根据服务器/环境动态加载服务器配置?

    目前 我设置了 Maven 配置文件 以便能够为不同的环境 开发 演示 暂存 生产等 部署我的项目 并且它工作得很好 但问题是 对于我拥有的每个模块 Web 应用程序 我需要复制 粘贴此配置文件 它们都是属性文件 当我需要更改环境 服务器配
  • Java可以进行进程监控吗?

    是否可以用Java编写一个在托盘中运行的应用程序 并且当启动某个应用程序时 它可以检测到它 我想对某些程序执行此操作 以了解我每周使用它们多长时间 我是 Java 新手 所以我不知道 Java 是否是最适合此操作的语言 或者它是否具有对操作
  • LinkedBlockingQueue 抛出 InterruptedException

    我有这段代码 ALinkedBlockingQueue应该只抛出一个Exception如果在等待添加到队列时被中断 但这个队列是无限的 所以它应该尽快添加 为什么我的关闭方法会抛出一个InterruptedException private
  • Selenium Webdriver 中的 IF 语句

    我想知道是否有人可以帮助我解决我正在尝试解决的问题以及 Java 中 Webdriver 的 If 语句 当登录到我正在测试的应用程序时 可以在主页之前进入安全问题页面 如果是新用户等 我希望测试中的代码做的是 如果出现安全问题页面 请填写
  • 如何更改MultipartFile的originalFilename

    我在服务器端有一个 MultipartFile 文件 我想更改该文件的原始文件名 但该类仅支持 getOriginalFilename 谁能帮我这个 PS 上传的是图片文件 多谢 您可以使用 MockMultipartFile 类更改名称
  • 如何使用 JRE 部署 JavaFX 11 桌面应用程序

    我有一个 JavaFX JDK 8 桌面业务应用程序 它使用 Java Web Start 进行部署 用户安装了 Java 8 只需访问 URL 我的 AWS Linux 服务器上的公共 URL 即可下载 启动应用程序 使用 Web Sta
  • 使用反射 API 填充 Proto 中的地图字段

    我正在尝试编写一个模块 该模块将获取 Message Builder 和从字段名称到值的映射 并将用值填充构建器 一切正常 直到我遇到地图字段 使用 Proto3 我收到一条特定消息 我知道我可以执行该消息的字段 builder b put

随机推荐

  • Blender相关学习笔记

    blender m idea mm 0 1 2 5 0 4 10 0 24 6 1 环选 alt 左键 2 分离 V 3 从两个边中创建面 选择两条 或多条 边 然后按F 4 复制 shift D 复制某一个模型 或部分 到另一个图层 编辑
  • 国际软件项目经理的七大素质

    国际软件项目经理的七大素质 1 在一个或多个应用领域内使用整合了道德 法律和经济问题的工程方法来设计合适的解决方案 2 懂得确定客户需求并将其转换成软件需求的过程 3 履行项目经理的职责 善于处理技术和管理方面的事务 4 懂得并使用有用的项
  • 人脸特征点检测

    CVPR2016刚刚落下帷幕 本文对面部特征点定位的论文做一个简单总结 让大家快速了解该领域最新的研究进展 希望能给读者们带来启发 CVPR2016相关的文章大致可以分为三大类 处理大姿态问题 处理表情问题 处理遮挡问题 1 姿态鲁棒的人脸
  • 描述性能测试工作中的完整过程?

    有简单接触 采用的工具是Jmeter 进行轻量级的压力测试 1 确定好压力测试的功能模块 首先用Jmeter录制脚本 然后对脚本进行优化 2 对一些数据进行参数化 利用CSV导入存在txt文档里面的数据 3 设计测试场景 4 执行压力测试
  • 如何在windows的DOS窗口中正常显示中文(UTF-8字符)

    打开CMD exe命令行窗口 通过 chcp命令改变代码页 UTF 8的代码页为65001 ANSI OEM 简体中文 GBK为936 window default OEM 美国为437 如果chcp命令得到437 那么一定不能显示中文 此
  • 无法安装vmnet8虚拟网络适配器、vmware network editor未响应、注册失败,请检查账号数据库配置是否正确的解决

    文章目录 虚拟网络适配器安装 vmware network editor未响应 注册失败 请检查账号数据库配置是否正确的解决 关于第一次安装虚拟机的 全文约 423 字 预计阅读时长 2分钟 虚拟网络适配器安装 vmware network
  • rol/ror in c++

    template
  • 20天拿下华为OD笔试之【BFS】2023Q1A-微服务的集成测试【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解

    BFS 2023Q1A 微服务的集成测试 题目描述与示例 题目描述 现在有 n 个容器服务 服务的启动可能有一定的依赖性 有些服务启动没有依赖 其次服务自身启动加载会消耗一些时间 给你一个 nxn 的二维矩阵 useTime 其中 useT
  • simulink仿真adc采样和epwm输出基础知识讲解

    F28027 12位ADC 2的y次方 tbclk 计数时钟的频率 tprd 一个周期内记得个数 1 tbclk 每次计一个数的时间 一个pwm周期的时间 pwm的周期 时基计数器 CRT 计数时钟由系统时钟分频来的 比较寄存器 CMR 决
  • 大数据、数据分析和数据挖掘的区别

    大数据 数据分析 数据挖掘的区别是 大数据是互联网的海量数据挖掘 而数据挖掘更多是针对内部企业行业小众化的数据挖掘 数据分析就是进行做出针对性的分析和诊断 大数据需要分析的是趋势和发展 数据挖掘主要发现的是问题和诊断 1 大数据 big d
  • 软件项目管理的平衡原则和高效原则

    1 平衡原则 在我们讨论软件项目为什么会失败时 列出了很多的原因 答案有很多 如管理问题 技术问题 人员问题等等 但是 有一个根本的问题是最容易被忽视的 也是软件系统的用户 软件开发商 销售代理商最不愿证实的 那就是 需求 资源 工期 质量
  • 计算机网络 网络层——IP数据报 详记

    IP 数据报的格式 一个 IP 数据报由首部和数据两部分组成 首部的前一部分是固定长度 共 20 字节 是所有 IP 数据报必须具有的 在首部的固定部分的后面是一些可选字段 其长度是可变的 IP数据报首部的固定部分中的各字段 版本 占4位
  • 信号量机制

    简介 信号量是一种数据结构 信号量的值与相应资源的使用情况有关 信号量的值由P V操作改变 常用信号量 整型信号量 整型信号量S的等待 唤醒机制 P V操作 wait S while S lt 0 do no op s signal S S
  • python字符串与列表

    字符串 字符串定义 输入输出 定义 切片是指对操作的对象截取其中一部分的操作 适用范围 字符串 列表 元组都支持切片操作 切片的语法 起始下标 结束 步长 字符串中的索引是从 0 开始的 最后一个元素的索引是 1 字符串的常见操作 查找 f
  • centos7搭建ftp服务器及ftp配置讲解

    ftp 即文件传输 它是INTERNET上仍然常用的最老的网络协议之一 它为系统提供了通过网络与远程服务器传输的简单方法 FTP服务器包的名称为vsftpd 一 vsftpd安装 并简单配置启动 安装 很简单 一句话 yum install
  • Socket接收数据耗时

    1 遇到问题 首先说明一下我遇到的问题 服务端传递Byte数组 长度在900w 客户端接收时会耗时10s 我的代码是这样的 2 Socket缓冲区 http t zoukankan com bigberg p 7747419 html 每个
  • 即刻掌握python格式化输出的三种方式 (o゜▽゜)o☆

    目录 1 f 转化的格式化输出方式 2 格式化输出的方法 3 format 格式化输出的方法 1 f 转化的格式化输出方式 只需要在我们要格式化输出的内容开头引号的前面加上 f 在字符串内要转义的内容用 括起来即可 模板 print f x
  • 企业微信登录-前端实现

    企业微信登录 企业微信登录 前端具体实现 下面代码中配置项的字段具体用途说明可以阅读企业微信开发者说明文档 我们通过提供的企业微信登录组件来进行站内登录 下面是我封装的登录组件以及使用方法 weChatLogin vue 封装的组件
  • hudi-hive-sync

    hudi hive sync Syncing to Hive 有两种方式 在hudi 写时同步 使用run sync tool sh 脚本进行同步 1 代码同步 改方法最终会同步元数据 但是会抛出异常 val spark SparkSess
  • spring:AOP面向切面编程+事务管理

    目录 一 Aop Aspect Oriented Programming 二 springAOP实现 1 XML实现 2 注解实现 三 spring事务管理 一 Aop Aspect Oriented Programming 将程序中的非业