首页 > 其他分享 >AOP

AOP

时间:2023-07-28 10:35:52浏览次数:30  
标签:execution 通知 切入点 AOP 注解 执行 方法

一、AOP

1.AOP

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

2.场景

(1)部分功能运行较慢,定位执行耗时较长的业务方法,此时需要统计每一个业务方法的执行耗时

(2)记录操作日志

(3)权限控制

(4)事务管理

4.优势

(1)代码无侵入

(2)减少重复代码

(3)提升开发效率

(4)维护方便

5.核心概念

(1)连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)。

(2)通知:Advice,指那些重复的逻辑,也就是共性功能(最终体现为一个方法)。

(3)切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用。

(4)切面:Aspect,描述通知与切入点的对应关系(通知+切入点)。

(5)目标对象:Target,通知所应用的对象

6.AOP执行流程

image-20230728084340706

二、通知类型

1.类型

(1)@Around:环绕通知,此注解标注的方法在目标方法前、后都执行。

(2)@Before:前置通知,此注解标注的方法在目标方法前被执行。

(3)@After:后置通知,此注解标注的方法在目标方法后被执行。

(4)@AfterReturning:返回后通知,此注解标注的方法在目标方法后都被执行,有异常不会执行。

(5)@AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行。

2.注意事项

(1)@Around环绕通知需要自己调用ProceedingJoinPoint( ) 来让原始方法执行,其他通知不需要考虑目标方法执行。

(2)@Around环绕通知方法的返回值,必须定为Project,来接收原始方法的返回值。

3.@PointCut

该注解的作用是将公共的切入点表达式抽取出来,需要用到时引用该切入点表达式即可。

三、通知顺序

1.当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会执行。

2.执行顺序:

(1)不同切面类中,默认按照切面类的类字母排序:

  • 目标方法前的通知方法:字母排序靠前的先执行
  • 目标方法后的通知方法:字母排序靠后的先执行

(2)用Order(数字)加在切面类上来控制顺序:

  • 目标方法前的通知方法:数字小的先执行
  • 目标方法后的通知方法:数字小的先执行

四、切入点表达式

1.切入点表达式

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

2.作用:主要来决定项目中的那些方法需要加入通知

3.常见形式

(1)execution(...):根据方法的签名来匹配

(2)@ammotation(...):根据注解匹配

4.execution

(1)execution主要根据方法的返回值、包名、类名、方法名参数等信息来匹配,语法为:

​ execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?)

(2)其中带?的表示可以省略的部分

  • 访问修饰符:可省略(比如:public、protected)
  • 包名.类名:可省略
  • throws异常:可省略(注意是方法上声明抛出的一场,不是实际抛出的异常

(3)可以使用通配符描述切入点

  • *:单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数、也可以通配包、类、方法的一部分

    execution(* com.*.service.*.update*(*))

  • ..:多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数

    execution(* com.tlias..DeptService.*(..))

5.@annotation

(1)@annotation切入点表达式,用于匹配表示有特定注解的方法。

(2)语法:@annotation(com.itheima.anno.Log)

image-20230728095907884

五、连接点

在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。

1.对于@Around通知,获取连接点信息只能使用ProceedingJoinPoint

2.对于其他四种通知,获取连接点信息只能使用JoinPoint,他是ProceedingJoinPoint的父类型

标签:execution,通知,切入点,AOP,注解,执行,方法
From: https://www.cnblogs.com/yang-jc/p/17586906.html

相关文章

  • AOP的学习-入门
    切面(Aspect)用来绑定通知(Advice)也就是日志和增强对方法-切入点(Pointcut)开发案例思路: 其中主要的是定义通知类后需要在类中写切入方法和通知方法  其中切入点表达式的格式  基本格式为表示在该类中所有方法, ......
  • 使用Memcached、Spring AOP构建数据库前端缓存框架
     上回说到Memcahed的安装及java客户端的使用(http://my249645546.iteye.com/blog/1420061),现在我们使用memcached、SpringAOP技术来构建一个数据库的缓存框架。数据库访问可能是很多网站的瓶颈。动不动就连接池耗尽、内存溢出等。前面已经讲到如果我们的网站是一个分布式的大型站......
  • .net 6 wpf aop
    .NET6中的WPF和AOP在.NET6中,WindowsPresentationFoundation(WPF)已经成为一个非常强大和流行的框架,用于创建富客户端应用程序。同时,面向切面编程(AOP)是一种优秀的编程范式,可以用于实现横切关注点的分离。本文将介绍在.NET6中如何结合使用WPF和AOP,并提供一些......
  • Spring AOP 和 拦截器 获取类上与方法上的注解
    方法1: https://blog.csdn.net/qq_37778018/article/details/125326847 在做一个跨过目标注解的鉴权功能时,想到了AOP与拦截器两种方式,其中@HasPermission是我自定义的注解,以下分别为AOP与拦截器获取访问目标类与方法上的注解的方法。由于我的系统在拦截器上配置了拦截过程,......
  • 《Spring6核心源码解析》已完结,涵盖IOC容器、AOP切面、AOT预编译、SpringMVC,面试杠杠
    作者:冰河星球:http://m6z.cn/6aeFbs博客:https://binghe.gitcode.host文章汇总:https://binghe.gitcode.host/md/all/all.html源码地址:https://github.com/binghe001/spring-annotation-book沉淀,成长,突破,帮助他人,成就自我。大家好,我是冰河~~提起Spring,可以这么说,Spring几乎......
  • spring6 ioc aop 从入门到精通零基础进阶学习路线?
    当你已经掌握了Spring框架的基础知识以及IoC和AOP的核心概念后,可以进一步深化你的学习。以下是更详细的学习路线:1.IoC容器进阶:-学习如何自定义Bean的初始化和销毁方法,并了解Bean生命周期的各个阶段。-深入了解Spring的作用域(Scope)概念,如单例模式、原型模式、会话模式和请求模......
  • AOP拦截日志
    首先对于AOP切面编程,我也是刚学习,了解不深,这边先引用老张的博客,方便大家学习。首先想一想,如果有这么一个需求,要记录整个项目的接口和调用情况,当然如果只是控制器的话,还是挺简单的,直接用一个过滤器或者一个中间件,还记得咱们开发Swagger拦截权限验证的中间件么,那个就很方便的把用......
  • 一文搞懂:什么是AOP?为什么要使用AOP?
    1、AOP解决什么问题在讲AOP之前,我们先来看下面的例子:现在我们有一个控制器UserControler,有查询,新增,编辑,删除用户等操作。publicclassUserController{publicvoidquery(){//查询用户操作}publicvoidadd(){//添加用户操作}publi......
  • AOP详解
    使用AOPAOP(AspectOrientedProgramming),即面向切面编程。AOP是一种新的编程方式,它和OOP不同,OOP把系统看作多个对象的交互,AOP把系统分解为不同的关注点,或者称之为切面(Aspect)。要理解AOP的概念,我们先用OOP举例,先回顾一下OOP(ObjectOrientedProgramming),OOP作为面向对象编程的模......
  • 如何动态修改 spring aop 切面信息?让自动日志输出框架更好用
    业务背景很久以前开源了一款auto-log自动日志打印框架。其中对于spring项目,默认实现了基于aop切面的日志输出。但是发现一个问题,如果切面定义为全切范围过大,于是v0.2版本就是基于注解@AutoLog实现的。只有指定注解的类或者方法才会生效,但是这样使用起来很不方便。......