springboot实现Aop

一、原理

AOP(Aspect Oriented Programming)的意思是:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可对业务逻辑进行增强,在不改变原有逻辑的基础上,在其前后进行处理。降低了耦合性,减少了大量冗余的操作。特别适合用于大量方法都需要进行相同处理的操作。

二、概念

aop可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加某种特定功能的一种技术。

这么看上去我们的程序就像个洋葱一样是一瓣一瓣的,我们的业务代码在中间,aop实现的增强方法会在我们打的业务方法执行前或者是执行后执行。

我们需要了解的:

1、切面(Aspect):一般是指被@Aspect修饰的类,代表着某一具体功能的AOP逻辑。
2、切入点(Pointcut):选择对哪些方法进行增强。
3、通知(Advice):对目标方法的增强,有一下五种增强的类型。
4、环绕通知(@Around):内部执行方法,可自定义在方法执行的前后操作。
5、前置通知(@Before):在方法执行前执行。
6、后置通知(@After):在方法执行后执行。
7、返回通知(@AfterReturning):在方法返回后执行。
8、异常通知(@AfterThrowing):在方法抛出异常后执行。
9、连接点(JoinPoint):就是那些被切入点选中的方法。这些方法会被增强处理。

对于不同的方法,使其生效的匹配方式也有很多:

表达式类型  

 功能
execution() 匹配方法,最全的一个
args()  匹配入参类型
@args()匹配入参类型上的注解
@annotation() 匹配方法上的注解
within()匹配类路径
@within() 匹配类上的注解
this()匹配类路径,实际上AOP代理的类
target()匹配类路径,目标类
@target()匹配类上的注解

三、实现

在这里我们使用annotation注解的方式实现切入

1、添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

2、创建一个用于切入的注解

ElementType.TYPE   声明这个注解可以在类上使用

ElementType.METHOD  声明这个注解可以在方法上使用

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Aop {
}

3、编写切面类

a.通过@Aspect告诉spring容器这是一个切面类,同时使用@Component注解将其声明成spring容器的组件

b.创建一个成员方法(不用有具体的实现),在上面添加上@Pointcat注解,声明这是个切入点方法,在这里我们就可以选择不同的匹配方式,我们这里使用的是@Aop注解的方式

c.实现具体的增强方法,通过@After、@Before...,并且在其中引入切入点方法


@Aspect
@Component
public class ScheduledAop {@Pointcut("@annotation(com.zxc.scheduled.annotation.Aop)")public void authcat(){}@After("authcat()")public void print(JoinPoint joinPoint){System.out.println("catprint running");}@Before("authcat()")public void before(JoinPoint joinPoint){String name = joinPoint.getSignature().getName();System.out.println(name);}@Around("authcat()")public void around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("开始执行");Object proceed = joinPoint.proceed();System.out.println("执行结束");}@AfterThrowing(value = "authcat()",throwing = "e")public void execption(JoinPoint joinPoint,Exception e){System.out.println(joinPoint.getSignature().getName() + ".exception:" + e.getMessage());}@AfterReturning("authcat()")public void afterReturn(JoinPoint joinPoint){System.out.println(joinPoint.getSignature().getName() + "执行结束");}
}

4、使用aop

在具体的业务方法上添加上我们自定义的@Aop注解,告诉aop从这里切入,这里我们自己抛出了个异常,用来测试@AfterException,异常的前置通知

@Component
public class MySchduled {private int count = 0;@Aop@Scheduled(cron = "0/3 * * * * ? ")public void print(){System.out.println("hello:" + count++);if(count == 3){throw new RuntimeException("hello");}}
}

5、开启aop

我们需要在启动类或者配置类上添加@EnableAspectJAutoProxy,开启aop

@SpringBootApplication
@EnableAspectJAutoProxy
public class AuthApplication {public static void main(String[] args) {SpringApplication.run(AuthApplication.class,args);}
}

四、aop的应用场景

  • 记录日志。通过在方法调用前后插入切面逻辑,可以方便地实现日志记录功能,例如在方法调用前记录方法名和参数,以及在方法调用后记录方法的返回值。
  • 监控方法运行时间(监控性能)。AOP可以用于监控方法的运行时间,从而找出性能瓶颈,提高系统的性能。
  • 权限控制。通过在方法调用前插入切面逻辑,可以实现安全性检查功能,例如检查用户的权限,只允许有特定权限的用户访问某些方法。
  • 缓存优化。AOP可以用于实现缓存管理功能,例如在方法调用前检查缓存中是否存在结果,在方法调用后将结果存入缓存,以提高系统的性能,避免重复计算。
  • 事务管理。AOP可以用于实现事务管理功能,例如在方法调用前开启事务,在方法调用后提交事务或回滚事务,简化事务管理的代码,提高代码的可读性和可维护性。
  • 异常处理。AOP可以用于实现异常处理功能,例如在方法调用后捕获异常并进行处理,统一处理异常,避免在每个方法中都进行异常处理的重复代码。
  • 性能统计和计数。AOP可以用于统计方法的执行时间、调用次数等信息,帮助定位系统瓶颈和优化点。

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

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

相关文章

JVM调优:JVM常用调优命令和参数

JVM调优是调整和配置Java虚拟机&#xff08;JVM&#xff09;的过程&#xff0c;以便最大限度地提高应用程序的性能和效率。这涉及到调整内存设置、选择合适的垃圾收集器&#xff0c;以及配置各种性能参数。 今天我们来了解一下参数如何设置 JVM调优的重要性 1.通过调整JVM参数…

YOLOv8独家原创改进: AKConv(可改变核卷积)

1.AKConv原理介绍 地址:2311.11587 (arxiv.org) 摘要:基于卷积运算的神经网络在深度学习领域取得了令人瞩目的成果,但标准卷积运算存在两个固有的缺陷。一方面,卷积运算仅限于局部窗口,无法捕获其他位置的信息, 并且它的采样形状是固定的。 另一方面,卷积核的大小固定为…

合肥知识付费系统解决方案,培训机构试听课不理想要怎么转化成学员?

现在到处都是培训机构&#xff0c;机构之间的竞争也是越发激烈的&#xff0c;很多机构为了获得生源&#xff0c;都会利用试听课来让家长或孩子&#xff0c;感受机构教学以及服务&#xff0c;那培训机构试听课不理想要怎么转化学员&#xff1f; 因为机构的试听课课程并不是同一种…

基于yolov8+gradio目标检测演示系统设计

YOLOv8与Gradio&#xff1a;开启目标检测的可视化新篇章 随着人工智能技术的飞速发展&#xff0c;目标检测作为计算机视觉领域的重要分支&#xff0c;已经广泛应用于安防监控、自动驾驶、医疗影像等多个领域。而YOLO&#xff08;You Only Look Once&#xff09;系列算法作为目…

光线追踪的渲染流程

光线追踪是一种基于物理的渲染技术&#xff0c;它模拟了光线在场景中的传播和相互作用过程。以下是光线追踪的基本渲染流程&#xff1a; 场景描述&#xff1a; 首先&#xff0c;需要描述场景&#xff0c;包括物体的几何形状、材质、光源等信息。每个物体通常由其几何形状&#…

23种设计模式学习导航

23种设计模式在Java中是一种重要的软件开发原则&#xff0c;旨在提高代码的可维护性、可扩展性和重用性。这些设计模式分为创建型模式、结构型模式和行为型模式三类。以下是这23种设计模式的Java完整版学习导航&#xff1a; 一、创建型模式&#xff08;5种&#xff09; 单例模…

Maven多环境与SpringBoot多环境配置

1. Maven多环境配置与应用 1.1 多环境开发 我们平常都是在自己的开发环境进行开发&#xff0c; 当开发完成后&#xff0c;需要把开发的功能部署到测试环境供测试人员进行测试使用&#xff0c; 等测试人员测试通过后&#xff0c;我们会将项目部署到生成环境上线使用。 这个时…

Spring中用到的设计模式有哪些

工厂模式,BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象。 单例模式,Spring依赖注入Bean实例默认是单例的。Spring依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创…

手写8大排序算法Java版

如何手写8大排序算法&#xff1a;从入门到精通 排序算法是计算机科学中最基本的算法之一&#xff0c;几乎所有编程语言的面试都会涉及到排序算法的问题。掌握排序算法不仅能够帮助你更好地理解数据结构和算法&#xff0c;还能提升你解决实际问题的能力。本文将带你从零开始&am…

VSCode调试Typescript

目录 背景介绍安装运行问题提示没有npm或者tsc命令提示tsc : 无法加载文件ts-debugObject.defineProperty(exports, __esModule, { value: true })调试时自动断点 背景介绍 由于近期要涉及鸿蒙相关的功能&#xff0c;之前没有接触过TS这个语言&#xff0c;所以想要熟悉一下。 …

Unity曲线插件Dreamteck Splines生成曲线Mesh

一、需求 脱离编辑器&#xff0c;运行时添加点&#xff0c;动态生成管道、线缆等曲线Mesh。 二、Dreamteck Splines简单运用 这方面资料不多&#xff0c;只有官方文档全英参考&#xff0c;而且又介绍得不详细。 2个重要组件介绍&#xff1a; SplineComputer&#xff1a; 最…

yum、rpm相关命令-工具手册

1.rpm文件: 1.1安装rpm文件: rpm -ivh kde-select.rpm23 #--nodeps强制安装,无视环境缺少依赖的检查 rpm -ivh --nodeps kde-select.rpm #--force --replacefiles可以无视rpm的冲突去强制替换(如两个rpm的安装路径相同了会有冲突) rpm -ivh --nodeps --force --replacef…

设计模式——备忘录模式(Memento)

备忘录模式&#xff08;Memento Pattern&#xff09;&#xff0c;也称为快照模式或Token模式&#xff0c;是GoF&#xff08;Gang of Four&#xff0c;四位设计模式专家&#xff09;提出的23种设计模式之一&#xff0c;属于行为模式。该模式的主要目的是在不破坏封装性的前提下&…

springboot中mybatisplus注意事项

使用代码生成工具CodeGenerator 需要修改的内容 dsc.setUsername(“root”); mysql账号dsc.setPassword(“root”); mysql密码strategy.setInclude(“crm_edu”); 表名pc.setModuleName(“eduservice”); //模块名 package com.test.demo;import com.baomidou.mybatisplus.a…

【超详细】跑通YOLOv8之深度学习环境配置2

环境配置2下载安装内容如下&#xff1a; CUDA&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive cudnn&#xff1a;https://developer.nvidia.com/rdp/cudnn-archive 版本&#xff1a;CUDA11.3 cudnn8.9.7 CUDA安装 简介 CUDA&#xff08;Compute Unified De…

vue如何进行webpack的配置

Vue.js 项目通常使用 Vue CLI 来创建和管理&#xff0c;它内置了 Webpack 作为构建工具。然而&#xff0c;如果你想要手动配置 Webpack 或者有特定的需求&#xff0c;你也可以在 Vue 项目中直接进行 Webpack 的配置。 下面是一个简单的步骤&#xff0c;介绍如何在 Vue 项目中手…

使用Python创建一个简单的任务管理器应用程序

在这篇文章中&#xff0c;我们将探讨如何使用Python和Tkinter库来创建一个简单但功能强大的任务管理器应用程序。这个应用程序将允许用户添加、编辑、删除和完成任务&#xff0c;并提供一个直观的用户界面。 1. 设计用户界面 我们首先设计用户界面。我们将使用Tkinter库来创建…

SEO之为什么研究关键词(一)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议 新手上云 初做网站的人很容易犯的最大错误之一是&#xff0c;脑袋一拍就贸然进入某个领域&#xff0c;跳过竞争研究&#xff0c;没规划好目标关键词就开始做网站。这样做…

一个递推通项公式研究

递推关系为a(n) ​pa(n−1) ​ qa(n−2) ​&#xff0c;本项前一项*2前前项&#xff0c;具体如 1&#xff0c;1&#xff0c;3&#xff0c;7&#xff0c;17&#xff0c;41&#xff0c;99&#xff0c;239&#xff0c;…… 一般的递推关系可以用以下方法 得两个解&#xff1a; …

python算法demo0512

最长回文数 代码 class Solution:def longestPalindrome(self, s: str) -> str:n len(s)if n < 2:return smax_len 1begin 0# dp[i][j] 表示 s[i..j] 是否是回文串dp [[False] * n for _ in range(n)]for i in range(n):dp[i][i] True# 递推开始# 先枚举子串长度fo…