JavaWeb——后端AOP面向特定方法编程

七、AOP

1. 概述

AOP(Aspect Oriented Programming):面向切面编程、面向方法编程,其实就是面向特定方法编程

场景:

  • 案例部分功能运行较慢,定位执行耗时较长的业务方法,此时需要统计每个业务方法的执行耗时,也就是我们想在方法前面或者后面执行一些操作
  • 记录操作日志
  • 权限控制
  • 事务管理

实现:

引入依赖

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

主流实现是动态代理。SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定方法进行编程——运行的就是代理对象

@Slf4j
@Component
@Aspect  // AOP类
public class TimeAspect {

    // 加在哪些方法上
    @Around("execution(* com.example.server.*.*(..))")  // 切入点表达式
    public Object recordTime(ProceedingJoinPoint jointPoint) throws Throwable {
        // 1. 记录开始时间
        long begin = System.currentTimeMillis();
        // 2. 调用原始方法运行
        Object result = jointPoint.proceed();
        // 3. 记录结束时间,计算方法执行耗时
        long end = System.currentTimeMillis();
        log.info(jointPoint.getSignature() + "方法耗时:{}ms", end - begin);
        return result;
    }
}

核心概念:

  • 连接点: JointPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)——它覆盖的每一个方法都可以看作一个连接点
  • 通知: Advice,重复的逻辑,也就是共性功能,体现为一个方法
  • 切入点: PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用
  • 切面: Aspect,通知与切入点的对应关系(通知+切入点)
  • 目标对象: Target,通知所应用的对象

2. 通知

2.1 通知类型

在这里插入图片描述

注意事项:

  • Around如果代码执行出现异常,后半段代码也不会执行
  • @Around环绕通知需要自己调用ProceedingJoinPoint.proceed()来让原始方法执行,其他通知不需要考虑目标方法执行
  • @Around环绕通知方法的返回值必须指定Object,来接收原始方法的返回值

在这里插入图片描述

如果是public修饰的切入点,其他类中也能进行调用

2.2 通知顺序

切面类类名,before正序,after倒序

用@Order(数字)加在切面类上来控制顺序,前数字小的先执行,后数字小的后执行

3. 切入点表达式

切入点表达式: 描述切入点方法的一种表达式

作用: 主要用来决定项目中哪些方法需要加入通知

常见形式:

1)execution(…):根据方法的签名来匹配,多个可以使用逻辑运算符连接——常用

  • 在这里插入图片描述

  • 书写建议

    • 所有业务方法名在命名时尽量规范,方便切入点表达式快速匹配。如:查询类方法都是find开头,更新类方法都是update开头
    • 描述切入点方法通常基于接口描述,而不是直接描述实现类,增强扩展性
    • 在满足业务需求的前提下,尽量缩小切入点的匹配范围

2)@annotation(…):根据注解匹配——不规则或不好描述的时候使用

自定义一个注解,在需要加切入点表达式的方法上加上自定义注解,@annotation(注解的全类名)

4. 连接点

可以在通知中获取连接点的相关信息——像反射部分

可以篡改目标方法执行的结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

了解ASP.NET Core 中的文件提供程序

写在前面 ASP.NET Core 通过文件提供程序来抽象化文件系统访问。分为物理文件提供程序(PhysicalFileProvider)和清单嵌入的文件提供程序(ManifestEmbeddedFileProvider)还有复合文件提供程序(CompositeFileProvider )&#xff1b;其中PhysicalFileProvider 提供对物理文件系统…

echarts - xAxis.type设置time时该如何使用formatter的分级模板

echarts 文档中描述了x轴的多种类型 一、type: ‘value’ ‘value’ 数值轴&#xff0c;适用于连续数据。 此时x轴数据是从零开始&#xff0c;有数据大小的区分。 【注意】 因为xAxis.data是为category服务的&#xff0c;所以xAxis.data里面设置的数据无效。 二、type: ‘ca…

计算机配件杂谈-鼠标

目录 基础知识鼠标的发展鼠标的左右手鼠标的显示样式鼠标的移动和可见性移动可见性 现在的我们的生活工作都基本上离不开电脑了&#xff0c;不管是你平时玩玩游戏&#xff0c;上班工作等等&#xff1b; 今天将关于鼠标的一些小的技巧分享出来&#xff0c;共勉&#xff01; 基础…

【SPDK】【NoF】使用SPDK实现NVMe over Fabrics Target

本文使用两台PC&#xff0c;一台做NVMe over Fabrics Target&#xff08;服务端&#xff09;&#xff0c;一台做NVMe over Fabrics initiator&#xff08;客户端&#xff09;。首先使用SoftRoCE来实现底层的rdma传输&#xff0c;然后使用SPDK来实现NVMe over Fabrics Target。 …

同一局域网如何共享文件

一、Windows文件共享设置步骤 1.在需要共享文件的电脑上&#xff0c;右击要共享的文件夹&#xff0c;选择“属性” 2.在“共享”选项卡中&#xff0c;点击“高级共享” 3.勾选“共享此文件夹”并设定共享名称&#xff0c;点击“权限”设置具体访问权限。 4.在其他电脑上&#x…

Stable Diffusion初体验

体验了下 Stable Diffusion 2.0 的图片生成&#xff0c;效果还是挺惊艳的&#xff0c;没有细调prompt输入&#xff0c;直接输入了下面的内容&#xff1a; generate a Elimination Game image of burnning tree, Cyberpunk style 然后点击生成&#xff0c;经过了10多秒的等待就输…

跨国文件传输网络丢包的四大原因和修复方式

在全球化的影响下&#xff0c;跨国传输在企业和个人的日常工作中发挥着越来越重要的作用。然而&#xff0c;由于各种原因&#xff0c;网络丢包问题时有发生。本文将详细分析跨国文件传输网络丢包的四大原因&#xff0c;并介绍相应的修复方式。 一、跨国文件传输网络丢包的四大原…

pytorch09:可视化工具-TensorBoard,实现卷积核和特征图可视化

目录 一、TensorBoard简介二、TensorBoard安装三、TensorBoard运行可视化四、TensorBoard详细使用4.1 SummaryWriter4.2 add_scalar()4.3 add_scalars()4.4 add_histogram()4.4.1实际项目开发使用 4.5 add_image()4.6 torchvision.utils.make_grid4.7 卷积核和特征图可视化4.7.…

Android开发Flutter使用SharedPreferences示例

文章目录 SharedPreferences具体使用 SharedPreferences Android原生开发经常会用SharedPreferences来保存一些设置&#xff0c;Flutter用什么来保存这些设置呢&#xff1f; 在Flutter中&#xff0c;你可以使用shared_preferences插件来实现类似Android原生开发中的SharedPref…

低抖动可编程SPXO SG-8200CG, SG-8201CG -高稳定性和低抖动特性

描述 SG-8200CG和SG-8201CG (sg -8201系列)利用爱普生新的低噪声分n锁相环技术&#xff0c;与上一代爱普生可编程晶体振荡器相比&#xff0c;稳定性提高了约2x&#xff0c;相位抖动降低了<1/25。sg -8201系列可编程为1.2MHz至170MHz的任何频率&#xff0c;工作温度范围可达…

tcp/ip协议2实现的插图,数据结构6 (24 - 章)

(142) 142 二四1 TCP传输控制协议 tcpstat统计量与tcp 函数调用链 (143) 143 二四2 TCP传输控制协议 宏定义与常量值–上 (144) 144 二四3 TCP传输控制协议 宏定义与常量值–下 (145) 145 二四4 TCP传输控制协议 结构tcphdr,tcpiphdr (146) 146 二四5 TCP传输控制协议 结构 tcp…

【MATLAB】ICEEMDAN_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 ICEEMDAN-LSTM神经网络时序预测算法是一种结合了改进的完全扩展经验模态分解&#xff08;ICEEMDAN&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 …

x-cmd pkg | raku - 渐进类型的、多范式的编程语言

目录 简介首次用户技术特点相关的术语进一步阅读 简介 Raku 是 Perl 家族中的一种编程语言&#xff0c;原名 Perl 6&#xff0c;主要设计者为 Larry Wall&#xff0c;从2000年开始开发&#xff0c;2019年10月更名为 Raku&#xff0c;是一种通用的、渐进类型的、多范式的编程语…

C++常用库函数大小写转换

在我们在编写代码时大小写转换是基础知识&#xff0c;这篇博客将通过介绍C常用库函数来回顾和学习一种不一样的大小写转换 目录 一、islower/isupper函数二、tolower/toupper函数三、ASCLL码 一、islower/isupper函数 islower和isupper函数是C标准库中的字符分类函数&#xff…

什么是检索增强生成 (RAG)

什么是 RAG RAG&#xff0c;即检索增强生成&#xff0c;是一种将预训练的大型语言模型的功能与外部数据源相结合的技术。这种方法将 GPT-3 或 GPT-4 等 LLM 的生成能力与专用数据搜索机制的精确性相结合&#xff0c;从而形成一个可以提供细微响应的系统。 本文更详细地探讨了…

搭建Eureka服务注册中心

前言 我们在别的章节中已经详细讲解过eureka注册中心的作用&#xff0c;本节会简单讲解eureka作用&#xff0c;侧重注册中心的搭建。 Eureka作为服务注册中心可以进行服务注册和服务发现&#xff0c;注册在上面的服务可以到Eureka上进行服务实例的拉取&#xff0c;主要作用就是…

加载符号文件

1、加载符号文件 当程序突发崩溃时&#xff0c;当我们尝试通过core文件分析原因时&#xff0c;通常会遇到以下问题&#xff0c;那么这种情况该怎么解决呢&#xff1f; 适用场景 二进制文件与符号文件分离的情况。 # 将test中的调试信息以外的数据剥离&#xff0c;生成符号文…

性能分析与调优: Linux 文件系统观测工具

目录 一、实验 1.环境 2.mount 3.free 4.top 5.vmstat 6.sar 7.slabtop 8.strace 9.opensnoop 10.filetop 11.cachestat 二、问题 1.Ftrace实例如何实现 2.Function trace 如何跟踪实例 3.function_graph Trace 如何跟踪实例 4.trace event 如何跟踪实例 5.未…

C语言入门教程,C语言学习教程(第一部分:编程基础 )二

九、进制详解&#xff1a;二进制、八进制和十六进制 我们平时使用的数字都是由 0~9 共十个数字组成的&#xff0c;例如 1、9、10、297、952 等&#xff0c;一个数字最多能表示九&#xff0c;如果要表示十、十一、二十九、一百等&#xff0c;就需要多个数字组合起来。 例如表示…

SpringIOC之support模块GenericApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…