当前位置: 首页 > article >正文

SpringAOPSpring事物管理

AOP

Aspect Oriented Programming

面向切面编程:

面向切面编程是面向对象编程的补充延续

面向切面编程思想是将程序中非业务代码(提交事物,打印日志,权限验证,统一异常处理),

然后在调用业务代码时,通过一个代理对象帮助我们调用这些提取出来的非业务代码,这样在业务代码不用显示的调用非业务

AOP是OOP的延续,是软件开发中的一个热点,是java开发中的一个重要内容,利用AOP可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率

面向切面编程的好处

减少重复,专注业务

==核心原理:==使用动态代理的方式在执行方法前后或出现异常的时候做加入相关的逻辑

使用案例:

==事务处理:==开启事务,关闭事务,出现异常后回滚事务

==权限判断:==在执行方法前,判断是否具有权限

在这里插入图片描述

AOP的基本概念

链接点(Joinpoint):

类中可以被增强的方法,这个方法就被称为链接点

切入点(point cut) :

类中有很多方法可以被增强,但实际只有add和update被增强了,那么add和update方法就被称之为切入点(实际实现连接的点)

通知(Advice):

通知是指一个切面在特定的链接点要做的事情(增强的功能),通知分为方法执行前通知,方法执行后通知,环绕通知等

目标:(Target):

代理的目标对象(链接点,切入点所在类)

代理(Proxy):

向目标对象应用通知时创建的代理对象

springAOP实现

AspectJ是基于Java语言的AOP框架,它提供了强大的AOP功能,而且实现的方式更简洁,使用更方便,而且还支持注解式开发,所以Spring又将AspectJ的对于AOP的实现也引入到自己的框架中

AOP相关的jar包

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

AspectJ常用的通知类型

前置通知,后置通知,返回通知,异常通知,环绕通知

@Before 前置通知:

方法执行之前

@After 后置通知:

方法执行之后,无论是否出现异常

@AfterReturnning 返回通知:

方法成功执行之后通知,出现异常不执行

@AfterThrowing 异常通知:

抛出异常之后通知

@Around 环绕通知:

方法执行前后都有通知

基于注解方式的实现

启动 AspectJ 支持:<aop:aspectj-autoproxy />

@Component
@Aspect
public class AOPDemo {
@Before("execution(* com.ff.spring.dao.UserDao.*(..))")
public void saveLog(){
System.out.println("saveLog");
}
@AfterThrowing(value = "execution(*com.ff.spring.dao.UserDao.*(..))",throwing = "e")
public void afterthrow(Throwable e){
System.out.println("afterthrow");
}
public void aroundAdvice(ProceedingJoinPoint joinPoint){
try {
//前置通知
Object[] objects = joinPoint.getArgs();
joinPoint.proceed();//调用我们自己的目标方法
//返回通知
} catch (Throwable throwable) {
throwable.printStackTrace();
//异常通知
}
//后置通知
}
}

表达式说明

在这里插入图片描述

Spring事务管理

事务管理本质上是数据库提供的一种管理机制

数据库事务管理是对一次数据库操作过程中执行的多条语句进行管理,确保一次操作过程中的多条sql要么都执行成功要么都不执行,从而保证数据一致性

例如:转账 sqlA -500 B+500 确保转账数据的一致

spring事物管理指的是spring框架对提交事务这一功能进行封装,让程序员在业务开发中不需要显示的提交事务

Spring中的事务管理分为两种形式:

1,编程式事务管理

需要程序员在代码中自己控制事务提交和回滚

2.声明式事务管理

使用了AOP思想,可以为方法添加事务功能,它的控制是方法级别的

基于注解实现的 spring 事务管理

Spring 框架,提供事物管理实现类是 DataSourceTransactionManager.

配置事务管理

配置事物管理器
<!-- 配置 spring 事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

注解方式

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

@Transactional

@Transactional 可以添加在方法上 ,也可以添加在类上

  • 如果添加到类上,此类中所有方法都在spring事务管理管理中运行
  • 声明式事务失效场景

  • 1.@Transactional用在非public方法上
  • 2.方法中出现异常被catch捕获
  • 3.方法中出现编译期异常,还会提交事务
  • 4.数据库引擎不支持事务

http://www.kler.cn/a/287955.html

相关文章:

  • 详解map与multimap容器
  • 【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】
  • 利用OpenAI进行测试需求分析——从电商网站需求到测试用例的生成
  • 全面解读 USB Key:定义、使用场景、加密技术及 Java 实现
  • HarmonyOS ArkTs 解决流式传输编码问题
  • flink实战 -- flink SQL 实现列转行
  • UE5蓝图 抽卡出货概率
  • 批量替换字符串中的某子串序列为对应的另一子串序列(z3求解器解多元方程时很好用)
  • 【C#】字段
  • 在麒麟系统安装php7.4中遇到的问题
  • uniapp微信小程序3D XR-FRAME
  • 机器学习之监督学习(二)逻辑回归(二元分类问题)
  • 【ESP32】mqtt 发送和接收
  • 半导体是什么?
  • Spark MLlib模型训练—回归算法 Random forest regression
  • 【uniapp重大bug】uni-data-select的localdata改变,也会触发@change方法
  • Unity(2022.3.41LTS) - UI简介,了解
  • 鸿蒙(API 12 Beta3版)【媒体资源使用指导】Media Library Kit媒体文件管理服务
  • PHP高效进销存管理系统智能管理库存销售与采购系统小程序源码
  • Java 实现二叉树展平为链表
  • python打包 exe 提示no module named flask
  • 关于zotero无法识别拖入的pdf和caj的题录信息
  • 安全随机数生成指南
  • 38次8.28(docker03:容器网络,主从镜像)
  • 23种设计模式之代理模式
  • 如何写接口自动化测试断言?