AOP的常见使用方法

面向切面编程(AOP,Aspect-Oriented Programming)

面向切面编程是一种软件设计和编程范式,它旨在解决在传统面向对象编程(OOP)中难以模块化处理的“横切关注点”问题。横切关注点是指那些跨越多个对象、类或服务,并影响整个系统的行为,但与这些类的核心业务逻辑并不紧密相关的功能,例如日志记录、事务管理、安全检查、性能统计等。

AOP的主要概念:

  1. 切面(Aspect)

    • 切面是AOP中的核心单元,它包含了应用中的一个或多个关注点的实现。切面可以包含多个通知(Advice),并在特定连接点(Join Point)上执行。
  2. 连接点(Join Point)

    • 连接点是在程序执行过程中明确的点,如方法调用、异常抛出等,它是可以插入切面行为的地方。
  3. 通知(Advice)

    • 通知定义了在连接点处要采取的动作类型。有多种类型的Advice:
      • 前置通知(Before advice):在目标方法执行前执行。
      • 后置通知(After advice):在目标方法正常返回后执行,无论方法是否抛出异常。
      • 返回通知(After returning advice):仅在目标方法成功执行并返回时执行。
      • 异常通知(After throwing advice):在目标方法抛出异常后执行。
      • 环绕通知(Around advice):包围目标方法执行,在方法调用前后都可以进行自定义操作,并决定何时以及是否调用原方法。
  4. 切入点(Pointcut)

    • 切入点表达式用于匹配一组连接点,定义了通知应该在哪里应用。它可以是一个方法签名、类名或者其他符合AOP框架语法的表达式,用于定位到具体的连接点集合。
  5. 织入(Weaving)

    • 织入是将切面应用到目标对象来创建代理对象的过程。这可以在编译时(静态织入)、加载时(类装载器织入)或运行时(动态代理织入)完成。

AOP在 Spring 框架里的常见注解:

@Aspect

  • 用于定义一个切面类,表明此类包含了一系列的通知方法。
@Aspect
public class LoggingAspect {
    // ...
}

@Before

  • 前置通知,指定一个方法作为前置增强,在目标方法执行前被调用。
  • @Before("execution(* com.example.service.MyService.*(..))")
    public void beforeAdvice(JoinPoint joinPoint) {
        // ...
    }

    @AfterReturning

  • 后置通知(正常返回后),在目标方法成功执行并返回后执行此通知方法。
@AfterReturning(pointcut = "execution(* com.example.service.MyService.get*(..))", returning = "result")
public void afterReturningAdvice(Object result) {
    // ...
}

@AfterThrowing

  • 异常通知,在目标方法抛出异常后执行此通知方法。
@AfterThrowing(pointcut = "execution(* com.example.service.MyService.*(..))", throwing = "ex")
public void afterThrowingAdvice(IllegalArgumentException ex) {
    // ...
}

@After

  • 最终通知,无论方法是否正常结束或抛出异常都会执行的方法。
@After("execution(* com.example.service.MyService.*(..))")
public void afterFinallyAdvice() {
    // ...
}

@Around

  • 环绕通知,最强大的通知类型,可以控制目标方法的整个执行过程,包括决定何时执行、何时结束以及修改方法的返回值等。
@Around("execution(* com.example.service.MyService.*(..))")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
    // 在环绕通知中,需要手动调用ProceedingJoinPoint的proceed()方法来执行原方法
    // ...
    return pjp.proceed();
}

@Pointcut

  • 定义一个切入点表达式,可以复用这个表达式在多个通知中。
@Pointcut("execution(* com.example.service.*.*(..))")
public void businessServiceOperation() {}

@Before("businessServiceOperation()")
public void beforeBusinessService() {
    // ...
}

@After("businessServiceOperation()")
public void afterBusinessService() {
    // ...
}

切点表达式:

1 execution():

2.@annotation():

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

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

相关文章

每日OJ题_牛客HJ74 参数解析(IO型OJ)

目录 牛客HJ74 参数解析 解析代码1 解析代码2 牛客HJ74 参数解析 参数解析_牛客题霸_牛客网 解析代码1 #include <iostream> #include <string> #include <vector> using namespace std; int main() {string str "";getline(cin, str);vecto…

windows安装ElasticSearch踩坑记

ElasticSearch是一个开源的分布式搜索和分析引擎。它提供实时分布式搜索功能&#xff0c;可以索引和搜索大量的结构化和非结构化数据。Elasticsearch以其速度、可伸缩性和处理复杂查询的能力而闻名。它常用于日志分析、全文搜索、文档搜索和数据分析等领域。使用ElasticSearch的…

AHU 数据库 实验五

【实验名称】 实验5 数据库的数据更新与视图管理 【实验目的】 1. 熟悉数据更新操作的概念与操作类型&#xff1b; 2. 熟练掌握INSERT、UPDATE、DELETE语句的基本语法&#xff1b; 3. 熟练运用INSERT、UPDATE、DELETE语句实现数据的插入、修改与删除…

git学习(创建项目提交代码)

操作步骤如下 git init //初始化git remote add origin https://gitee.com/aydvvs.git //建立连接git remote -v //查看git add . //添加到暂存区git push 返送到暂存区git status // 查看提交代码git commit -m初次提交git push -u origin "master"//提交远程分支 …

获取bean的几种情况总结

1. 情景一 bean 对应的类没有实现任何接口 根据 bean 本身的类型获取 bean 测试&#xff1a;IOC容器中同类型的 bean 只有一个 正常获取到 IOC 容器中的那个 bean 对象 测试&#xff1a;IOC 容器中同类型的 bean 有多个 会抛出 NoUniqueBeanDefinitionException 异常&#xf…

STM32---ADC

ADC 概念 众所周知&#xff0c;GPIO只能读入高电平或者低电平&#xff0c;那如果现有一个模拟量&#xff0c;该如何读取呢&#xff0c;比如电压的范围是0~3.3v&#xff0c;如何获取电压的值。就需要ADC&#xff08;Analog-Digital Converter&#xff09;了。ADC可以将引脚上连…

自动从Android上拉取指定文件

需求场景 利用Mac中的脚本编辑器实现从连接的Android设备中获取指定的文件。 环境 macOS Monterey 版本 12.7.1脚本编辑器adb环境&#xff08;如果没有的话&#xff0c;可以网上搜下Mac配置adb&#xff09; 实现方案 1、打开脚本编辑器&#xff1b; 2、新建一个脚本文件&…

视频编解码技术介绍 - 基本概念篇

第一章 视频编解码技术介绍 - 基本概念篇 文章目录 前言1. 我的疑问1.1 什么是视频编解码技术1.2 为什么会有视频编解码技术1.3 视频编解码中有哪些核心技术1.4 作为开发者需要重点了解视频编解码中的哪些技术 2. 视频编解码的历史3. 基本概念3.1 像素3.2 分辨率3.3 ppi(像素密…

详细讲解Xilinx DDR3 的MIG IP生成步骤及参数含义

前几篇文章讲解了SDRAM到DDR3各自的变化&#xff0c;本文讲解如何使用DDR3&#xff0c;在Altera的Cyclone IV开发板上一般会使用SDRAM作为存储数据的芯片&#xff0c;而Xilinx的S6和7000系列一般使用DDR3作为存储数据的芯片。 从SDRAM芯片内部结构分析其原理&#xff0c;从内部…

腾讯云8核16g服务器性能好不好?亲测并发数支持人数

腾讯云8核16G轻量服务器CPU性能如何&#xff1f;18M带宽支持多少人在线&#xff1f;轻量应用服务器具有100%CPU性能&#xff0c;18M带宽下载速度2304KB/秒&#xff0c;折合2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;月流量3500GB&#xff0c;折合每天116.6GB流量&…

AHU 人工智能实验-CCA

神经网络覆盖算法——CCA&#xff08;基于Ling Zhang 和Bo Zhang论文) Abstract 在这篇文章中我将介绍基于张铃和张钹学者提出的CCA算法&#xff0c;并实现代码复现&#xff0c;给出使用的数据集&#xff0c;以及实验结果对比。 1. Introduction 1.1 Background 我们知道自…

外包干了6天后悔了,技术明显进步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

[虚拟机保护逆向] [HGAME 2023 week4]vm

[虚拟机保护逆向] [HGAME 2023 week4]vm 虚拟机逆向的注意点&#xff1a;具体每个函数的功能&#xff0c;和其对应的硬件编码的*长度* 和 *含义*&#xff0c;都分析出来后就可以编写脚本将题目的opcode转化位vm实际执行的指令 &#xff1a;分析完成函数功能后就可以编写脚本输出…

跑马灯样式

这里的公告是要做成&#xff0c;跑马灯的样式&#xff0c;文字是会移动并且隐藏掉的。 HTML&#xff1a; <div class"notice"><div class"yrr"><img src"./img/ia_100000018.png" alt"" /></div><div …

循序渐进丨MogDB 数据库特性之动态数据脱敏机制

数据脱敏是行之有效的数据库隐私保护方案之一&#xff0c;可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化脱敏策略来实现对隐私数据保护的技术&#xff0c;可以在保留原始数据的前提下有效地解决非授权用户对敏感信息访问的问题。当管理员…

Fastjson 1.2.24 反序列化导致任意命令执行漏洞复现(CVE-2017-18349)

写在前面 CVE-2017-18349 指的是 fastjson 1.2.24 及之前版本存在的反序列化漏洞&#xff0c;fastjson 于 1.2.24 版本后增加了反序列化白名单&#xff1b; 而在 2019 年&#xff0c;fastjson 又被爆出在 fastjson< 1.2.47 的版本中&#xff0c;攻击者可以利用特殊构造的 …

js【详解】async await

为什么要使用 async await async await 实现了使用同步的语法实现异步&#xff0c;不再需要借助回调函数&#xff0c;让代码更加易于理解和维护。 (async function () {// await 必须放在 async 函数中try {// 加载第一张图片const img1 await loadImg1()// 加载第二张图片co…

xss.haozi.me靶机 通关

0x00 没有任何过滤可以直接注入<img srcx οnerrοralert(1)> 0x01 使用了testarea标签将我们的输入内容以普通的字符串进行展示 但是我们可以将标签进行闭合 </textarea><img srcx οnerrοralert(1)> 0x02 我们依然可以先闭合之后添加属性a" οncl…

Arcgis小技巧【20】——属性表有东西,缩放至图层却看不到?

一、问题分析 这是一个看似正常的要素类数据&#xff0c;打开它的属性表&#xff0c;里面有一行要素&#xff1a; 说明这不是空数据。 回到地图界面&#xff0c;在图层列表中&#xff0c;右键单击&#xff0c;点击【缩放至图层】。 使用过这个功能的应该知道&#xff0c;点击…

数据结构奇妙旅程之二叉平衡树

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …