首页 > 其他分享 >AOP中的execution表达式

AOP中的execution表达式

时间:2024-03-27 12:59:38浏览次数:23  
标签:.. service 指定 AOP execution com example 表达式

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

在学习Spring中,必然要学习AOP,那么execution表达式有是必不可少的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、知识讲解?

1 AOP是什么?

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,用于将横切关注点从业务逻辑中分离出来,以便更好地实现关注点的模块化和重用。在传统的面向对象编程中,程序的功能被分解为多个对象,每个对象负责一部分功能,但是横跨多个对象的横切关注点(例如日志记录、性能监控、事务管理等)往往会散布在各个对象中,导致代码的重复和耦合性增加。

AOP 的核心思想是将这些横切关注点抽取出来,形成一个称为切面(Aspect)的模块,然后通过将切面与主要业务逻辑进行关联,实现在主要业务逻辑执行前、后或周围插入特定的行为,而无需修改主要业务逻辑代码。这样,AOP 可以在不改变原有代码的情况下,实现横切关注点的统一管理和重用。

AOP 中的一些关键概念包括:

  1. 切面(Aspect):用于封装横切关注点的模块。切面由切点(Pointcut)和增强(Advice)组成,其中切点定义了在何处应用增强,而增强定义了在何时以及如何应用增强。

  2. 切点(Pointcut):定义了在程序中哪些地方应用增强。切点通常使用表达式或者注解来指定目标方法。

  3. 增强(Advice):定义了在切点处执行的具体操作。常见的增强包括前置通知(Before advice)、后置通知(After advice)、环绕通知(Around advice)、异常通知(After-throwing advice)和最终通知(After-returning advice)。

  4. 连接点(Join Point):程序执行过程中可以插入增强的点。在 AOP 中,切点就是连接点。

  5. 织入(Weaving):将切面与目标对象关联起来并创建通知代理对象的过程。织入可以在编译时、类加载时或运行时进行。

通过使用 AOP,可以有效地提高代码的模块化程度、减少代码的重复性,并且可以更好地实现关注点的集中管理和横切功能的重用。在实际开发中,AOP 被广泛应用于日志记录、事务管理、性能监控等方面。


2 execution表达式

在 AOP 中,execution 是一个关键词,用于定义切点(Pointcut),即指定在哪些方法上应用增强。

二、使用execution表达式

1.execution表达式

execution 表达式通常用于切点表达式中,其基本语法如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

各个部分的含义如下:

modifiers-pattern: 指定方法的修饰符,如 public、protected、private 等,默认匹配任意修饰符。
ret-type-pattern: 指定方法的返回类型,如 void、String 等,默认匹配任意返回类型。
declaring-type-pattern: 指定方法所属的类,可以使用类的全限定名,如 com.example.service.* 表示匹配 com.example.service 包下的所有类,默认匹配任意类。
name-pattern: 指定方法的名称,可以使用通配符 ,如 add 表示以 add 开头的方法,默认匹配任意方法名。
param-pattern: 指定方法的参数列表,可以使用 … 表示任意个参数,如 *(…) 表示任意参数列表的方法,默认匹配无参数方法。
throws-pattern: 指定方法可能抛出的异常类型,如 java.lang.Exception、java.lang.RuntimeException 等,默认匹配任意异常类型。
以下是一些示例 execution 表达式:

execution(* com.example.service.UserService.(…)):匹配 com.example.service.UserService 类中的所有方法。
execution(public * com.example.service.UserService.
(…)):匹配 com.example.service.UserService 类中的所有 public 方法。
execution(* com.example.service.UserService.add*(…)):匹配 com.example.service.UserService 类中以 add 开头的所有方法。
execution(* com.example.service.Service.(…)):匹配 com.example.service 包下的所有以 Service 结尾的类的所有方法。
使用 execution 表达式可以灵活地定义切点,以精确地指定在哪些方法上应用增强。

2使用示例

在这里插入图片描述

因为我的业务层是在service包下,所以execution表达式可以写成下方样式

<aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.llf.service..*.*(..))"/>
    </aop:config>

这段 XML 配置是 Spring AOP 的配置,用于将事务增强(txAdvice)应用于指定的切点。

  • <aop:config>:这是 Spring AOP 配置的根元素,用于定义 AOP 相关的配置信息。

  • <aop:advisor>:这是定义切面(Advisor)的元素。切面是将通知(Advice)与切点(Pointcut)组合起来的一种结构,用于在特定的切点处应用通知。

    • advice-ref="txAdvice":这里指定了要应用的通知的引用名称为 txAdvice。通常,txAdvice 是一个事务增强的实现,用于管理事务。

    • pointcut="execution(* com.llf.service..*.*(..))":这里指定了切点,即要应用通知的位置。execution 是切点表达式的关键词,用于定义方法的匹配规则。具体地,这个切点表达式表示匹配 com.llf.service 包及其子包下的所有类的所有方法。

综合起来,这段配置的作用是将事务增强(txAdvice)应用于 com.llf.service 包及其子包下所有类的所有方法,从而实现对这些方法的事务管理。


总结

以下是我总结的execution表达式的使用

  1. 匹配指定包下的所有类的所有方法:

    execution(* com.example.service..*.*(..))
    
  2. 匹配指定包下的所有类的指定方法名:

    execution(* com.example.service..*.do*(..))
    
  3. 匹配指定包下的指定类的所有方法:

    execution(* com.example.service.UserService.*(..))
    
  4. 匹配指定包下的指定类的指定方法名:

    execution(* com.example.service.UserService.add*(..))
    
  5. 匹配指定包下的所有类的指定返回类型的方法:

    execution(public String com.example.service..*.*(..))
    
  6. 匹配指定包下的所有类的指定参数类型的方法:

    execution(* com.example.service..*.*(String, int))
    
  7. 匹配指定包下的所有类的指定参数数量的方法:

    execution(* com.example.service..*.*(String, *))
    
  8. 匹配指定包下的所有类的无参数方法:

    execution(* com.example.service..*.*())
    
  9. 匹配指定包下的所有类的所有 public 方法:

    execution(public * com.example.service..*.*(..))
    
  10. 匹配指定包下的所有类的所有 protected 方法:

    execution(protected * com.example.service..*.*(..))
    
  11. 匹配指定包下的所有类的所有 private 方法:

    execution(private * com.example.service..*.*(..))
    
  12. 匹配指定包下的所有类的所有静态方法:

    execution(* com.example.service..*.*(..))
    

以上是一些常见的 execution 表达式模板,可以根据具体的需求来组合和调整,以匹配特定的方法。
AOP中的execution表达式模板还有很多,我只简单做了一个示例,感兴趣的可以去官网查看

标签:..,service,指定,AOP,execution,com,example,表达式
From: https://blog.csdn.net/lfyyyyy/article/details/137072686

相关文章

  • Cron 表达式解析
    Cron表达式解析Cron表达式是一种强大的工具,用于在特定时间自动执行计划任务。无论是在服务器维护、数据库备份,还是在发送定时邮件等场景,cron表达式都能提供精确的时间控制。Cron表达式的基本结构Cron表达式由6或7个由空格分隔的时间字段组成,每个字段代表了不同的时间单位:......
  • AOP切面试编程
    1.AOP基础1.1AOP概述什么是AOP?AOP英文全称:AspectOrientedProgramming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。AOP面向方法编程,可以做到在不改动这些原始方法的基础上,针对特定的方法进行功能的增强。AOP的作用:在程序运行期间在不......
  • Spring AOP实现过程
    @Aspect驱动定义一个切面类Aspect即在声明的类,增加@Component@Aspect两个注解,SpringBoot中要引入spring-boot-starter-aop依赖包定义切点定义切点,并定义切点在哪些地方执行,采用PointCut注解完成,如@Pointcut(public*com.xxx.xxx..(..))规则:修饰符(可以不写,但不能......
  • lambda 表达式
    JDK1.8的新特性创建一个匿名内部类,lambda简洁一些实际是如何删减的初步认识总结:只有一个参数的lambda表达式注意:1.参数名字可以随便起2.参数的类型可以省略---》因为上下文有类型推断3.参数只有一个的话,()可以省略有两个参数和返回值的lambda表达式原始的新的:......
  • SpringBoot+Aop实现业务操作日志demo
    1、建表CREATETABLE`business_log`(`id`bigintNOTNULLAUTO_INCREMENT,`name`varchar(100)NULLCOMMENT'业务名称',`description`varchar(255)NULLCOMMENT'业务操作描述',`operator`varchar(100)NULLCOMMENT'操作人',`oper_t......
  • 正则表达式
    字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”而“\(”则匹配“(”。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹......
  • 突破编程_C++_C++11新特性(lambda表达式的基础知识)
    1Lambda表达式简介1.1Lambda表达式的定义与概念Lambda表达式是C++11引入的一种函数对象的匿名表示方法,它的定义与概念基于数学中的λ演算。Lambda表达式为程序员提供了一种更加简洁、灵活的方式来定义轻量级的、临时的、内联的函数对象,通常用于函数式编程的场景......
  • Day 15(操作符)赋值+单目+关系+逻辑+条件+逗号表达式+下标引用+函数调用
    1.赋值操作符:=   复合赋值符:+=         -=       *=       /=     &=      |=     ^=       %=    >>=    <<=eg: a=a+2→a+=2  a=a>>1→a>>=1连续赋值:a=b=c(从右向左运行)(不推荐此方法)2......
  • 0基础学习C语言第二章:运算符与表达式
    表达式:表达式是c语言的主体,在c语言中,表达式由操作符和操作数组成。简单的表达式可以只有一个操作数。根据操作符的个数,可以将表达式分为简单表达式和复杂表达式,简单的表达式只含有一个操作符(如:5+5),而复杂的表达式则含有两个或者两个以上的操作符(如5+5+6*4);表达式是本身什么事情也......
  • 正则表达式
    正则表达式,看了书上的解释后,我的理解是:筛选出来符合设定规则的字符。一些规则如下python中使用re模块re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。语法为:re.match(pattern,string,flags=0),pattern为正则表达式,string为搜......