掘金 人工智能 04月29日 10:27
精通 Spring AOP Execution 表达式:精准匹配你的切点
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入解析了AOP(面向切面编程)中定义切点的重要方式——execution表达式,详细讲解了其语法结构、常用示例以及多表达式组合。同时,还介绍了within和@annotation这两种切点指示符,分别侧重于类或包的范围匹配和方法注解匹配。通过具体示例和代码,阐述了如何在Spring AOP中使用这些表达式,以实现灵活的切面逻辑控制,帮助开发者更好地理解和应用AOP。

🚀**execution表达式**:`execution()`是表达式主体,用于匹配方法执行的切点。其完整语法包括修饰符模式、返回值类型模式、类名模式、方法名模式和参数模式,可以灵活地匹配指定包、类、方法等。

💡**within表达式**:适用于根据类型(类或包)匹配连接点,侧重于类或包的范围匹配。`within(包名..*)`匹配指定包及其子包下的所有类,而`within(全限定类名)`则只匹配指定类的所有方法。

📌**@annotation表达式**:根据方法上是否存在特定注解来匹配连接点,适用于根据方法上的注解来精确控制切面逻辑的应用。通过自定义注解,并使用`@annotation(注解全限定名)`,可以匹配所有带有该注解的方法。

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

0 前言

AOP中,execution表达式是定义切点(Pointcut)的重要方式,切点决定了在哪些方法上应用增强(Advice,如前置通知、后置通知等 )。

1 表达式语法结构

execution表达式完整语法格式为:

execution([修饰符模式] 返回值类型模式 [类名模式]方法名模式(参数模式)[异常模式])

修饰符模式、异常模式较少用,常用部分:

2 常用示例

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

execution(* com.example.dao..*.*(..)) ,表示匹配 com.example.dao 包及其子包下所有类的所有方法,第一个 * 匹配任意返回值类型,第二个 * 匹配所有类,第三个 * 匹配所有方法名,(..) 匹配任意参数。

匹配指定类的所有方法:

execution(* com.example.service.UserService.*(..)) ,即匹配 com.example.service.UserService 类的所有方法 。

匹配指定接口所有实现类的方法:

execution(* com.example.dao.GenericDAO+.*(..))+ 表示匹配 GenericDAO 接口的所有实现类的方法。

匹配特定方法名开头的方法:execution(* save*(..)) ,表示匹配所有以 save 开头的方法,不限定返回值类型、类和参数。

3 多表达式组合

多个execution表达式之间可以通过逻辑运算符组合:

4 其他切点指示符

4.1 within表达式

主要用于根据类型(类或包)匹配连接点。即它可指定在哪些类或包中的方法执行时应用切面逻辑:

① 匹配指定包下的所有类

② 匹配指定类

4.2 @annotation表达式

根据方法上是否存在特定注解来匹配连接点。当某方法标注指定注解,该方法执行就触发相应切面逻辑。

① 自定义注解

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Loggable {}

② 用 @annotation 匹配带注解的方法

语法:

@annotation(注解全限定名)

示例:

// 匹配所有带有 @Loggable 的方法@annotation(com.example.annotation.Loggable)

示例:

@Aspect@Componentpublic class LoggingAspect {    @Pointcut("@annotation(com.example.annotation.Loggable)")    public void loggableMethods() {}    @Before("loggableMethods()")    public void beforeLoggableMethod(JoinPoint joinPoint) {        System.out.println("Before method: " + joinPoint.getSignature().getName());    }}

③ 在方法上用注解

import com.example.annotation.Loggable;import org.springframework.stereotype.Service;@Servicepublic class UserService {    @Loggable    public void saveUser() {        System.out.println("Saving user...");    }}

UserService#saveUser执行时,由于该方法有 @Loggable ,会触发 LoggingAspect 中的 beforeLoggableMethod 方法执行,实现在带特定注解的方法执行前添加切面逻辑。

4.3 小结

本文由博客一文多发平台 OpenWrite 发布!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

AOP execution表达式 within表达式 @annotation表达式 切点指示符
相关文章