Spring的AOP概念详解

news2024/7/4 6:27:31

AOP详解:

1.介绍:

面向切面编程,是一种将非业务代码与业务代码进行分离的一种思想,在实际开发中,往往有许多重复操作,例如事务提交,权限验证,保存口志等功能需要在业务代码重复调用,面向切面编程,就是将非业务代码进行抽取,然后在不修改原来代码的前提下,为我们的业务代码,添加额外的功能.

面向切面编程的好处就是: 减少重复,专注业务;
注意:面向切面编程只是面向对象编程的一种补充
2.核心原理:

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

3.使用案例:

事务处理:开启事务,关闭事务,出现异常后回滚事务 权限判断:在执行方法前,判断是否具有权限 日志:在执行前进行日志处理

4.总结:

AOP就是把重复的非业务代码通过动态代理的方式实现,让开发者配置一次后就不用再考虑重复的非业务代码

AOP思想不是spring中特有的,是java中的动态代理模式,是spring框架使用了这一思想

5.基本概念:

(1) 连接点(Joinpoint):类中可以被增强(可以添加额外功能的方法)的方法

(2) 切入点(Pointcut):类中实际被增强的方法,把额外功能实际切入的方法

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

(4) 目标(Target):代理的目标对象,连接点和切入点方法所在的类

(5) 代理(Proxy):向目标对象应用通知时创建的代理对象(目前使用的代理对象由spring框架生成,目前我们不需要关心)

6.springAOP实现:

下载 AOP 相关 jar

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

AspectJ 中常用的通知有五种类型:

注解放在对应的方法上方:

    @Before("execution(* com.lzy.springpro.dao.*.*(..))")
    public void saveLog(){
        System.out.println("方法执行成功");
    }

AOP中的通知类型:
@Before 前置通知,在我们的方法实际执行前调用
@After 后置通知,子啊方法执行后执行,即使出现异常也会执行
@AfterReturning 返回通知,方法成功执行之后通知,出现异常不通知
@AfterThrowing 异常通知,当切入点出现异常执行,没有异常不执行
@Around 环绕通知,方法执行前后都有通知,可以实现其余四个通知

启动 AspectJ 支持:

<aop:aspectj-autoproxy/>

同时spring.xml还要配置AOP相关:

xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=        
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        @Before("execution(* com.lzy.springpro.dao.AdminDao.saveAdmin(..))")
        @After("execution(* com.lzy.springpro.dao.*.*(..))")
        @AfterReturning("execution(* com.lzy.springpro.dao.*.*(..))")
        @AfterThrowing("execution(* com.lzy.springpro.dao.*.*(..))")
        @Around("execution(* com.lzy.springpro.dao.*.*(..))")

Around:

    @Around("execution(* com.lzy.springpro.dao.*.*(..))")
    public void around(ProceedingJoinPoint joinPoint){
        try{
            System.out.println("保存日志"); //前置通知

            Object[] args=joinPoint.getArgs();  //获取方法中的参数
            System.out.println(Arrays.toString(args));
            joinPoint.proceed();    //调用我们自己的方法

            System.out.println("提交事务"); //返回通知
        }catch (Throwable e){
            System.out.println("系统异常"); //异常通知
        }
        System.out.println("后置通知"); //后置通知
    }
7.Spring 事物管理
什么是数据库事务

​ 数据库事务是一次对数据库执行的若干操作的管理,这一次操作的若干条sql语句,应该是一个整体的单元

例如转账:

​ 一次转账操作,对于用户来讲已是一个操作,但是这一次操作中,会执行多条sql语句,例如语句1:从A账户减钱 语句2:从B账户加钱。两个语句必须是一个整体,要么都成功执行,要么都不执行。这是事务特征的最基本的原子性特征。只有当一次操作完成后,向数据库提交事务后,数据库才会将多条sql真正的执行。

为什么需要事务?

​ 保证数据的完整性,不能一半保存到数据库,一半没保存成功。

之前在jdbc中是每次执行完sql后,事务九自动提交的。(自动提交是有风险的)在mybatis中是手动sqlSession.commit();提交的,这很麻烦

spring事务管理:

​ spring事务管理就是AOP的基础上,当我们的方法完全执行后,再提交事务,如果方法中有异常,就不提交事务。

​ spring中的事务管理有两种方式:

1.编程式事务

​ 需要我们再业务代码中手动提交

2.声明式事务
配置事物管理器
<!-- 配置 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 可以添加在类上,这样类中所有的方法都在事务管理中进行
                   也可以添加在方法上,只有所添加的方法再事务管理中进行
 */
 @Transactional(rollbackFor = Exception.class)
public class LoginService {
	......	
}

声明式事务几种失效场景:

1.@Transactional用在了非public方法上面(受封装的不能直接获取的)
2.异常被catch捕获了,认为方法没有出现异常
3.默认出现编译期异常,事务失效,可以在@Transactional(rollbackFor=Exception.class)设置回滚异常类型为Exception,这样即使出现编译期异常,也是有效的
4.数据库引擎不支持事务,目前mysql中只有innodb引擎支持事务

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

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

相关文章

算法金 | Transformer,一个神奇的算法模型!!

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 在现代自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer 模型的出现带来了革命性的变…

算法 —— 滑动窗口

目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 找到字符串中所有字母异位词 长度最小的子数组 sum比target小就进窗口&#xff0c;sum比target大就出窗口&#xff0c;由于数组是正数&#xff0c;所以相加会使sum变大&#xff0c;相减…

云计算与生成式AI的技术盛宴!亚马逊云科技深圳 Community Day 社区活动流程抢先知道!

小李哥最近要给大家分享7月7日在深圳的即将举办的亚马逊云科技生成式AI社区活动Community Day &#xff0c;干货很多内容非常硬核&#xff0c;不仅有技术分享学习前沿AI技术&#xff0c;大家在现场还可以动手实践沉浸式体验大模型&#xff0c;另外参与现场活动还可以领取诸多精…

高优先线程

你开发的时候有么有遇到过一个问题&#xff1a;服务器的一个服务线程过几个小时断连一次&#xff0c;断连之后会马上重连这种情况。这是由于CPU负载较高,线程调度时将处理数据的线程挂起了一段时间导致的。 因此&#xff0c;我有考虑到把cpu的核心进行分散开来&#xff0c;就类…

关于发那科机器人系统升级方法

首先需要镜像备份和全备份&#xff0c;最好把机器人要到刻度线位置&#xff0c;零点位置 选择控制器启动&#xff0c;也可以按preevnext进入控制器模式

技术革新:如何用数据中台实现数字化转型

作为程序员&#xff0c;我们总是对技术如何改变企业运作充满好奇。今天&#xff0c;我们将深入探讨森马集团如何利用数据中台技术&#xff0c;实现从传统数据分析到数字化转型的华丽转身。 1. 技术背景&#xff1a;森马集团的数字化挑战 森马集团&#xff0c;一个在服饰行业占…

幻兽帕鲁服务器如何安装模组安装

由于模组多数为Window版本的&#xff0c;所以本教程以服务端为Window的作为演示&#xff08;Linux服务端的也是一样的操作&#xff09;百度莱卡云开服 如果你你是Linux版本的&#xff0c;请点击跳转切换服务端教程 接下来是本地安装模组包的方法&#xff08;服务器自带&#xf…

浅谈定时器之同步定时器

浅谈定时器之同步定时器 “同步定时器”&#xff08;Synchronizing Timer&#xff09;是一个特别的定时器&#xff0c;它用于确保在特定时间点上多个线程&#xff08;或虚拟用户&#xff09;同时发起请求&#xff0c;这对于测试系统在高并发情况下的表现尤为重要。本文将深入解…

通义灵码 Visual Studio 小白上手指南

一、下载和安装指南 本安装步骤适用于 Windows 10 及以上操作系统中安装和使用通义灵码。 步骤 1&#xff1a;准备工作 操作系统&#xff1a;Windows 10 及以上&#xff1b;下载并安装 ****Visual Studio 2022 17.3.0 及以上版本。 步骤 2&#xff1a;在 Visual Studio 202…

【Linux】:命令行参数

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux命令行参数的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入…

分享一个超级实用的东西——巴比达远程访问

前言 &#x1f388;家人们&#xff0c;今天我要和你们分享一个超级实用的东西——巴比达远程访问&#xff01;&#x1f389; &#x1f4bb;有了它&#xff0c;无论你身在何处&#xff0c;都能轻松访问家中的电脑&#x1f4bb;&#xff0c;就像在身边一样方便&#xff01;&…

C++类型转换可调用对象

目录 C的四种可视性类型转换 1.static_cast 2.reinterpret_cast 3.const_cast 4.dynamic_cast C中的可调用对象 普通函数 函数指针 仿函数 Lambda表达式 包装器function bind C的四种可视性类型转换 C语言中的类型转换是不安全、不明确的&#xff0c;于是C就出了更…

JavaFX布局-BorderPane

JavaFX布局-BorderPane 实现方式Java实现FXML实现 综合案例 将容器空间分成五个区域&#xff1a;顶部&#xff08;Top&#xff09;、底部&#xff08;Bottom&#xff09;、左侧&#xff08;Left&#xff09;、右侧&#xff08;Right&#xff09;和中心&#xff08;Center&#…

专题六:Spring源码之初始化容器BeanFactory

上一篇咱们通过一个例子介绍初始化容器上下文相关内容&#xff0c;并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点&#xff0c;和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…

OFDM关键技术——同步技术

同一符号内各子载波受到不同的相位偏转及幅度衰减&#xff0c; k 越大偏差越大&#xff1b;相位偏转与子载波序号 k 和符号序号 i 均有关&#xff0c;序号越大&#xff0c;相位偏转越大&#xff1b;引入了 ICI &#xff0c;系统信噪比降低&#xff1b;当采样偏差效果累积到一定…

苍穹外卖项目 常用注解 + 动态sql

常用注解 常见的注解解析方法有两种&#xff1a; 编译期直接扫描&#xff1a;编译器在编译 Java 代码的时候扫描对应的注解并处理&#xff0c;比如某个方法使用Override 注解&#xff0c;编译器在编译的时候就会检测当前的方法是否重写了父类对应的方法。运行期通过反射处理&…

CesiumJS【Basic】- #038 绘制轮廓线(Primitive方式)

文章目录 绘制轮廓线(Primitive方式)1 目标2 代码2.1 main.ts绘制轮廓线(Primitive方式) 1 目标 使用Primitive方式绘制轮廓线 2 代码 2.1 main.ts var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);v

设备通信-MODBUS协议和485接口

因水表远程监控和水泵数据监控系统&#xff0c;需了解物联网开发协议。 通信协议 通信协议说白了就是一种语言&#xff0c;一种通信双方都能听的懂得语言。 设备常用的通信协议有MODBUS RTU&#xff0c;PPI,MPI等&#xff0c;通信协议和我们常用的语言只是叫法不一样&#x…

预约小程序源码,云开发技术,无需服务器

介绍&#xff1a; 很多企业的业务都需要通过服务预约来完成&#xff0c;比如酒店、美容、家政等等。 但很多商家因缺少合适的服务预订工具&#xff0c;而不知道如何让客户尽快预约。 这种情况下&#xff0c;制作一个自己的预约小程序&#xff0c;客户只需要扫码或者在微信里…

8605 删数问题

这是一个典型的贪心算法问题。我们可以从高位开始&#xff0c;找到第一个比后面数字大的数字&#xff0c;删除它&#xff0c;然后继续这个过程&#xff0c;直到删除k个数字。如果我们已经删除了k个数字&#xff0c;但是还没有找到一个比后面数字大的数字&#xff0c;那么我们就…