文章目录
前言
提示:这里可以添加本文要记录的大概内容:
在学习Spring中,必然要学习AOP,那么execution表达式有是必不可少的。
提示:以下是本篇文章正文内容,下面案例可供参考
一、知识讲解?
1 AOP是什么?
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,用于将横切关注点从业务逻辑中分离出来,以便更好地实现关注点的模块化和重用。在传统的面向对象编程中,程序的功能被分解为多个对象,每个对象负责一部分功能,但是横跨多个对象的横切关注点(例如日志记录、性能监控、事务管理等)往往会散布在各个对象中,导致代码的重复和耦合性增加。
AOP 的核心思想是将这些横切关注点抽取出来,形成一个称为切面(Aspect)的模块,然后通过将切面与主要业务逻辑进行关联,实现在主要业务逻辑执行前、后或周围插入特定的行为,而无需修改主要业务逻辑代码。这样,AOP 可以在不改变原有代码的情况下,实现横切关注点的统一管理和重用。
AOP 中的一些关键概念包括:
-
切面(Aspect):用于封装横切关注点的模块。切面由切点(Pointcut)和增强(Advice)组成,其中切点定义了在何处应用增强,而增强定义了在何时以及如何应用增强。
-
切点(Pointcut):定义了在程序中哪些地方应用增强。切点通常使用表达式或者注解来指定目标方法。
-
增强(Advice):定义了在切点处执行的具体操作。常见的增强包括前置通知(Before advice)、后置通知(After advice)、环绕通知(Around advice)、异常通知(After-throwing advice)和最终通知(After-returning advice)。
-
连接点(Join Point):程序执行过程中可以插入增强的点。在 AOP 中,切点就是连接点。
-
织入(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表达式的使用
-
匹配指定包下的所有类的所有方法:
execution(* com.example.service..*.*(..))
-
匹配指定包下的所有类的指定方法名:
execution(* com.example.service..*.do*(..))
-
匹配指定包下的指定类的所有方法:
execution(* com.example.service.UserService.*(..))
-
匹配指定包下的指定类的指定方法名:
execution(* com.example.service.UserService.add*(..))
-
匹配指定包下的所有类的指定返回类型的方法:
execution(public String com.example.service..*.*(..))
-
匹配指定包下的所有类的指定参数类型的方法:
execution(* com.example.service..*.*(String, int))
-
匹配指定包下的所有类的指定参数数量的方法:
execution(* com.example.service..*.*(String, *))
-
匹配指定包下的所有类的无参数方法:
execution(* com.example.service..*.*())
-
匹配指定包下的所有类的所有 public 方法:
execution(public * com.example.service..*.*(..))
-
匹配指定包下的所有类的所有 protected 方法:
execution(protected * com.example.service..*.*(..))
-
匹配指定包下的所有类的所有 private 方法:
execution(private * com.example.service..*.*(..))
-
匹配指定包下的所有类的所有静态方法:
execution(* com.example.service..*.*(..))
以上是一些常见的 execution
表达式模板,可以根据具体的需求来组合和调整,以匹配特定的方法。
AOP中的execution表达式模板还有很多,我只简单做了一个示例,感兴趣的可以去官网查看