【Java】SpringAOP —— AOP是什么? 代码实现了SpringAOP

文章目录

  • 一、AOP是什么
  • 二、AOP的组成
  • 三、SpringAOP
  • 四、实现SpringAOP
    • 1.添加AOP框架支持
    • 2.定义切面切点
    • 3.定义相关通知
  • 总结


一、AOP是什么

AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某一类事情的集中处理。

就比如用户登录验证,一个网站的绝大部分功能,都要验证用户是否登录,因此就要在大多数功能中添加用户登录验证的代码或调用用户登录验证的方法,这是相当繁琐的,后期的开发维护成本也很高。

而AOP则可以解决这一问题。

对于这种功能统一,且频繁使用的功能,就可以使用AOP来统一处理了。


二、AOP的组成

  1. 切面(Aspect):由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包
    括了连接点的定义。
  2. 连接点(Join Point):程序执行中可以插入切面的一个点,可以是方法调用时,抛出异常时等等。
  3. 切点(Pointcut):Pointcut 的作用就是提供⼀组规则(使用 AspectJ pointcut expression language 来描述)来匹配 Join Point,给满足规则的 连接点 添加 通知。
  4. 通知(Advice):切面也是有目标的 ——它必须完成的工作。在 AOP 术语中,切面的工作被称之为通知。通知定义了切面是什么,何时使用,其描述了切面要完成的⼯作,还解决何时执行这个工作的问题。

切面就相当于加工厂,连接点是公司的待加工物品,切点是规定那些物品可以进行加工,通知则是加工这些物品


三、SpringAOP

Spring 切面类中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会通知本方法进行调用:

  • 前置通知使用 @Before:通知方法会在目标方法调用之前执行。
  • 后置通知使用 @After:通知方法会在目标方法返回或者抛出异常后调用。
  • 返回之后通知使用 @AfterReturning:通知方法会在目标方法返回后调用。
  • 抛异常后通知使用 @AfterThrowing:通知方法会在目标方法抛出异常后调用。
  • 环绕通知使用 @Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执
    行⾃定义的行为。

切点表达式说明:
AspectJ 支持三种通配符
* :匹配任意字符,只匹配⼀个元素(包,类,或方法,方法参数)
.. :匹配任意字符,可以匹配多个元素 ,在表示类时,必须和 * 联合使⽤。
+ \ :表示按照类型匹配指定类的所有类,必须跟在类名后面,如com.cad.Car+ ,表示继承该类的所有子类包括本身
切点表达式由切点函数组成,其中 execution() 是最常用的切点函数,用来匹配方法,语法为:

execution(<修饰符><返回类型><包.类.方法(参数)><异常>)
修饰符与异常一般省略

返回值:{void}无返回,{String}返回字符串,{*}任意

:{com.example.demo} 固定包demo包; {com.example.demo.*} demo包下任意包不包括demo包;{com.example.demo..}demo包下任意包 包括demo包;

: {Demo}固定类Demo类;{de*}以De开头的类;{*mo}以mo结尾的类;{*}任意类

方法名:{function}固定方法function方法;{fun*}以fun开头的方法;{*tion}以tion结尾的方法;{*}任意方法

参数:{}无参;{int} 一个整型参数;{int,int}两个整型参数;{..}任意参数


四、实现SpringAOP

1.添加AOP框架支持

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

2.定义切面切点

匹配方法的规则可以有多个,即可以有多个切点,切点方法不需要有方法体,只是需要这个方法名起一个标识作用.

@Aspect // 定义切面
@Component
public class UserAspect {

    // 切点
    @Pointcut("execution(* com.example.demo.Controller.UserController.*(..))")
    public void pointcutA(){}

    // 切点
    @Pointcut("execution(* com.example.demo.Controller.ArticleController.*(..))")
    public void pointcutB(){}



3.定义相关通知

通过注解来让方法变为通知方法,注解中填写切点的方法名来区分不同切点

@Aspect // 定义切面
@Component
public class UserAspect {

    // 切点
    @Pointcut("execution(* com.example.demo.Controller.UserController.*(..))")
    public void pointcutA(){}

    // 切点
    @Pointcut("execution(* com.example.demo.Controller.ArticleController.*(..))")
    public void pointcutB(){}



    @Before("pointcutA()")
    public void doBefore() {
        System.out.println("执行了前置通知");
    }
    @After("pointcutA()")
    public void doAfter() {
        System.out.println("执行了后置通知");
    }
    @Around("pointcutA()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        System.out.println("环绕通知开始执行");
        // 执行目标方法

        Object result = null;
        try {
            result = joinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("环绕通知执行完毕");
        return result;
    }
    @AfterReturning("pointcutA()")
    public void doAfterReturning() {
        System.out.println("执行了返回后通知");
    }
    @AfterThrowing("pointcutA()")
    public void doAfterThrowing() {
        System.out.println("抛出异常后通知");
    }
}

在这里插入图片描述
其中do getUser为连接点的输出内容在这里插入图片描述


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

相关文章

JVM 第四部分—垃圾回收相关概念 2

System.gc() 在默认情况下&#xff0c;通过System.gc()或者Runtime.getRuntime().gc()的调用&#xff0c;会显式触发Full GC&#xff0c;同时对老年代和新生代进行回收&#xff0c;尝试释放被丢弃对象占用的内存 然而System.gc()调用附带一个免责声明&#xff0c;无法保证对垃…

基于Camunda实现bpmn 2.0各种类型的任务

基于Camunda实现bpmn中各种类型任务 ​ Camunda Modeler -为流程设置器&#xff08;建模工具&#xff09;&#xff0c;用来构建我们的流程模型。Camunda Modeler流程绘图工具&#xff0c;支持三种协议类型流程文件分别为&#xff1a;BPMN、DMN、Form。 ​ Camunda Modeler下载…

【Python】进阶学习:pandas--isin()用法详解

【Python】进阶学习&#xff1a;pandas–isin()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅…

【java】20:枚举

枚举的二种实现方式 1) 自定义类实现枚举 2) 使用 enum 关键字实现枚举 自定义实现枚举&#xff1a; 1.不需要提供setXxx方法&#xff0c;因为枚举对象值通常为只读. 2.对枚举对象/属性使用final static共同修饰&#xff0c;实现底层优化. 3.枚举对象名通常使用全部大写&…

电子电气架构——汽车以太网诊断路由汇总

电子电气架构——汽车以太网诊断路由汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将…

江科大stm32学习笔记——【4-1】OLED

一.原理 1.调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息。 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上。 Keil调试模式&#xff1a;借助Keil软件的调…

深入sizeof与strlen

一、sizeof与strlen的对比 sizeofstrlensizeof是单目操作符strlen是库函数&#xff0c;使用需要包含头文件string.hsizeof计算操作数所占用的内存&#xff0c;单位是字节strlen是求字符串长度&#xff0c;统计的是\0之前字符的个数不关注内存中存放什么数据 关注内存总是否有\0…

关于 HTTP 协议,你了解多少

HTTP协议 FastAPI 是建立在 HTTP 协议之上&#xff0c;所以为了更好的掌握 FastAPI。我们需要先简单的了解一下 HTTP协议 简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;遵循经典的客户端-服务器模型&#xff0c;客户端打开连接以发出请求&#xff0c;然后等…

Linux内核队列queue.h

文章目录 一、简介二、SLIST单向无尾链表2.1 介绍2.2 操作2.3 例子 三、STAILQ单向有尾链表四、LIST双向无尾链表五、TAILQ双向有尾链表六、CIRCLEQ循环链表七、queue源码参考 一、简介 queue.h是一个非常经典的文件&#xff0c;定义了一系列宏的操作&#xff0c;它定义了一系…

复盘昨天的内容

vue调节css 后端做业务处理 1.分类管理 GetMapping("/queryCtc")public ApiResult queryCtc(){return ctcService.queryCtc();}/*** 修改类目信息* return*/PutMapping("/updateCtc")public ApiResult updateCtc(RequestBody ShopCtc shopCtc){return c…

element-plus 的el-img组件访问oss图片自动拼接前端地址

这是我的组件代码 <el-image style"width: 100px; height: 100px" :src"scope.row.logo" />访问时候 竟然凭借上了前端的地址端口 原来是我的oss服务是使用了域名做cdn加速的 内容分发网络&#xff08;CDN&#xff09;或者服务器配置&#xff0c;可…

2.1 mov、add和sub加减指令实操体验

汇编语言 1. mov操作 1.1 mov移动值 mov指令把右边的值移动到左边 mount c d:masm c: debug r ax 0034 r 073f:0100 mov ax,7t1.2 mov移动寄存器的值 把右边寄存器的值赋值给左边的寄存器 a 073f:0105 mov bx,axt1.3 mov高八位&#xff08;high&#xff09;和低八位&am…

【leetcode】用栈实现队列

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: 在做此题之前&#xff0c;我们先要实现栈&#xff0c;这在上个博客中已经写过&#xf…

Topaz Gigapixel AI:让每一张照片都焕发新生mac/win版

Topaz Gigapixel AI 是一款革命性的图像增强软件&#xff0c;它利用先进的人工智能技术&#xff0c;能够显著提升图像的分辨率和质量。无论是摄影爱好者还是专业摄影师&#xff0c;这款软件都能帮助他们将模糊的、低分辨率的照片转化为清晰、细腻的高分辨率图像。 Topaz Gigap…

2024腾讯云优惠券领取和使用方法,北漂程序员整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

工会管理系统:繁琐工作,一套系统全搞定

hello&#xff0c;我是贝格前端工场&#xff0c;之前给大家介绍了各类通用的B端管理系统&#xff0c;受到了大家的欢迎。本次开始介绍针对具体行业的管理系统该如何设计和开发&#xff0c;欢迎大家持续关注、点赞&#xff0c;如有系统定制需求可以私信我们。 一、工会管理系统…

红外电力设施检测数据集

需要的同学私信联系&#xff0c;推荐关注上面图片右下角的订阅号平台 自取下载。 红外检测技术目标检测准确、速度快、涵盖面积广&#xff0c;可以在不停电、不接触、不解体、不采样的状态下&#xff0c;对带电设备的状态进行检测和诊断&#xff0c;精确查找出设备的劣化程度、…

蓝桥杯Java B组历年真题(2013年-2021年)

一、2013年真题 1、世纪末的星期 使用日期类判断就行&#xff0c;这里使用LocalDate&#xff0c;也可以使用Calendar类 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:无需package // 2: 类名必须Main, 不可修改p…

【c++】VS2022静态库断点 “The breakpoint will not currently be hit. “

调试vs c++项目 :断点没符号加载 单独给使用的部分webrtc的源码构建了一个vs的静态库,给dll 用, 今天断点发现 No symbols have been loaded for this document.看到pdb lib 都有生成。但是就是断点提示:“The breakpoint will not currently be hit. No symbols have been…

赵文彬将出席无磷锅炉工艺助剂在锅炉水节水节能应用

演讲嘉宾&#xff1a;赵文彬 集团副总/技术总监 上远未来水务集团有限公司 演讲题目&#xff1a;无磷锅炉工艺助剂在锅炉水节水节能方面的应用 会议简介 “十四五”规划中提出&#xff0c;提高工业、能源领城智能化与信息化融合&#xff0c;明确“低碳经济”新的战略目标&a…
最新文章