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

news2024/11/26 9:29:44

目录

一、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"/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/941011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++初阶】stack的常见操作和模拟实现

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

LNMT动静分离+keepalived

目录 前言 一、实验拓扑 二、配置tomcat 三、nfs配置 四、配置NGINX 五、配置NGINX的双机热备 六、验证双机热备 前言 LNMT动静分离是指在LNMT架构中使用动静分离技术&#xff0c;将动态请求和静态请求分开处理和分发&#xff0c;以提高性能和可扩展性。这种架构使用Nginx…

在GPU服务器(Linux)上安装Anaconda和PyTorch环境

安装Anaconda3 Anaconda官网&#xff1a;https://repo.anaconda.com/archive/ 根据自己需要&#xff0c;复制安装包名字&#xff0c;以Anaconda3-2023.07-2-Linux-x86_64.sh为例 命名规则&#xff1a;Anaconda3-<版本号>-Linux-x86_64.sh 在终端输入命令&#xff0c;下…

设备分类、设备号申请和注销

一、Linux内核对设备的分类 linux的文件种类&#xff1a; -&#xff1a;普通文件d&#xff1a;目录文件p&#xff1a;管道文件s&#xff1a;本地socket文件l&#xff1a;链接文件c&#xff1a;字符设备b&#xff1a;块设备 Linux内核按驱动程序实现模型框架的不同&#xff0…

JSX底层渲染机制

JSX底层渲染机制 一,.步骤 1.把我们写的jsx语法编译为虚拟DOM【virtualDOM】 虚拟DOM对象&#xff1a;框架自己内部构建的一套对象体系&#xff08;对象的相关成员都是React内部绑定的&#xff09;&#xff0c;基于这些属性描述出我们所构建视图中的DOM接的相关特征 1基于ba…

【crypto++使用】使用crypto++库函数运行RSA非对称加密

系列文章目录 1.&#xff08;全网最详细攻略&#xff09;【Crypto】在Visual studio2022中运行Cryptopp 文章目录 系列文章目录前言一、RSA加密过程、步骤可学习的网址 二、代码部分1.visual studio编程注意一个标准案例提供给大家 2.RSA密钥生成思考&#xff1a; 3.关于RSA的…

计算机视觉-卷积神经网络

目录 计算机视觉的发展历程 卷积神经网络 卷积&#xff08;Convolution&#xff09; 卷积计算 感受野&#xff08;Receptive Field&#xff09; 步幅&#xff08;stride&#xff09; 感受野&#xff08;Receptive Field&#xff09; 多输入通道、多输出通道和批量操作 …

死信队列理解与使用

一、简介 在rabbitMQ中常用的交换机有三种&#xff0c;直连交换机、广播交换机、主题交换机&#xff1b; 直连交换机中队列与交换机需要约定好routingKey去进行绑定&#xff1b; 广播交换机并不需要routingKey绑定,只需队列与交换机绑定即可&#xff1b; 主题交换机最大的特…

dml dql 约束 数据库设计

dml 1.添加数据 *语法 &#xff1a; *insert into 表名&#xff08;列名1&#xff0c;列名2&#xff0c;……..列名n&#xff09;values(值1&#xff0c;值2&#xff0c;…值n) *注意&#xff1a; 1.列名和值要一一对应 2.如果表名后&#xff0c;不写列名&#xff0c;就要给…

QT 获取程序编译时间并且转化格式

前言 有的时候我们要在程序的关于界面加上程序的编译时间等信息。可以通过如下代码实现 QString buildTime QStringLiteral("%1 %2").arg(__DATE__).arg(__TIME__);ui->label->setText(buildTime);QDateTime dateTime QLocale("en_US").toDateTim…

easyx图形库6:实现飞机大战:

飞机大战 一.飞机大战的基本窗体&#xff1a;二.飞机大战的主要战斗场景元素&#xff1a;一.透明图片&#xff1a;二.精灵对象&#xff1a; 三.主游戏场景的元素&#xff1a;1.英雄飞机的结构体定义&#xff1a;2.英雄飞机的代码实现&#xff1a;3.游戏背景的结构体定义&#x…

Day5:react函数组件与类组件

「目标」: 持续输出&#xff01;每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 「主要面向群体&#xff1a;」前端开发工程师&#xff08;初、中、高级&#xff09;、应届、转行、培训、自学等同学 Day4-今日话题 react「函数组件和类组件」的区别&…

查局域网所有占用IP

查局域网所有占用IP 按&#xff1a;winr 出现下面界面&#xff0c;在文本框中输入 cmd 按确定即可出现cmd命令界面 在cmd命令窗口输入你想要ping的网段&#xff0c;下面192.168.20.%i即为你想要ping的网段&#xff0c;%i代表0-255 for /L %i IN (1,1,254) DO ping -w 1 -n 1…

(动态规划) 剑指 Offer 49. 丑数 ——【Leetcode每日一题】

❓剑指 Offer 49. 丑数 难度&#xff1a;中等 我们把只包含质因子 2、3 和 5 的数称作丑数&#xff08;Ugly Number&#xff09;。求按从小到大的顺序的第 n 个丑数。 示例: 输入: n 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 说明: 1 是丑数。…

2024年新iPad Pro将实现6年来最大的升级

彭博社的Mark Gurman长期以来一直将iPad Pro的下一次重大更新定在2024年&#xff0c;在最新一期的Power On时事通讯中&#xff0c;他详细阐述了一些细节&#xff0c;这些细节将使其成为“自2018年以来该产品的首次重大更新” 尽管Gurman将最近的iPad升级描述为“最近特别小”&…

word6 图文混排

目录 7-1 段落缩进排版7-2 搞定多级列表难题 7-1 段落缩进排版 段落对齐 缩进问题 悬挂缩进&#xff1a;缩进首行以外的段落 段落对齐&#xff1a; 7-2 搞定多级列表难题

k8s 安装 kubernetes安装教程 虚拟机安装k8s centos7安装k8s kuberadmin安装k8s k8s工具安装 k8s安装前配置参数

k8s采用master, node1, node2 。三台虚拟机安装的一主两从&#xff0c;机器已提前安装好docker。下面是机器配置&#xff0c;k8s安装过程&#xff0c;以及出现的问题与解决方法 虚拟机全部采用静态ip, master 30机器, node1 31机器, node2 32机器 机器ip 192.168.164.30 # ma…

【数据结构与算法篇】手撕八大排序算法之快排的非递归实现及递归版本优化(三路划分)

​&#x1f47b;内容专栏&#xff1a; 《数据结构与算法篇》 &#x1f428;本文概括&#xff1a; 利用数据结构栈(Stack)来模拟递归&#xff0c;实现快排的非递归版本&#xff1b;递归版本测试OJ题时&#xff0c;有大量重复元素样例不能通过&#xff0c;导致性能下降&#xff0…

Self-Supervised Learning

Self-Supervised Learning Bert 的数据是 340M parameters 抽象解释&#x1f446; Bert 单个字的预测 把一个字盖住&#xff1a; 1、把一个字替换成特殊字符(MASK)。 2、替换成随机的一个字,进行训练。 next sentence prediction 通过变换两个连起来的句子的顺序&#x…

C. Battle 2023 (ICPC) Jiangxi Provincial Contest -- Official Contest

Problem - C - Codeforces 题目大意&#xff1a;有n堆石子&#xff0c;给出一个数p&#xff0c;A先B后&#xff0c;每个人每次只能取p的幂个石子&#xff08;包括1&#xff09;问A能不能赢 1<n<3e5;1<p<1e18 思路&#xff1a;先递归算出sg函数看看&#xff0c;s…