AOP中的execution表达式


前言

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

在学习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表达式模板还有很多,我只简单做了一个示例,感兴趣的可以去官网查看

  • 41
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值