切面表达式:细节决定成败

一、切面表达式注解

注解是Java中非常重要的一种语法标记,Spring AOP中也通过注解的方式来定义切面。在定义切面时,可以使用@Aspect注解表示一个切面类,也可以使用@Before、@After、@Around等注解表示具体的切面执行时机。下面是一个使用注解定义切面并且在方法执行之前和之后打印日志的示例:

@Aspect
public class LogAspect {
    @Before("execution(* com.example.demo.service.*.*(..))")
    public void beforeLog() {
        System.out.println("Before invoking method.");
    }
    @After("execution(* com.example.demo.service.*.*(..))")
    public void afterLog() {
        System.out.println("After invoking method.");
    }
}

在该示例中,通过@Before和@After注解来表示在目标方法执行之前和之后执行。而@Aspect注解则表示该类是一个切面类。

二、Spring切面表达式

Spring AOP支持切点表达式,可以使用表达式来匹配满足某些条件的方法进行切面的处理。Spring AOP中使用AspectJ的切点表达式,其语法与AspectJ基本一致,但也有一些不同之处。下面是一些常用的切点表达式:

  • execution(* com.example.demo.service.*.*(..)):匹配com.example.demo.service包中所有类的所有方法。
  • execution(public * com.example.demo.service.UserService.*(..)):匹配com.example.demo.service.UserService接口中所有public方法。
  • execution(* com.example.demo.service.UserService+.*(..)):匹配com.example.demo.service.UserService接口及其所有实现类的所有方法。
  • @annotation(com.example.demo.annotation.Log):匹配所有被@Log注解标记的方法。
  • within(com.example.demo.service.*):匹配com.example.demo.service包中所有类的所有方法,但不包括子包中的。

三、切面表达式参数使用

除了上述示例中的切点表达式,还可以在切点表达式中使用参数。参数有两种类型:JoinPoint和ProceedingJoinPoint。JoinPoint表示方法的执行时机,而ProceedingJoinPoint则表示带有返回值的方法执行时机。下面是一个示例:

@Aspect
public class LogAspect {
    @AfterReturning(value = "@annotation(com.example.demo.annotation.Log)", returning = "result")
    public void afterLog(JoinPoint joinPoint, Object result) {
        System.out.println("After invoking method: " + joinPoint.getSignature().getName() + ", result: " + result);
    }
    @Around("@annotation(com.example.demo.annotation.Log)")
    public Object aroundLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("Before invoking method: " + proceedingJoinPoint.getSignature().getName());
        Object result = proceedingJoinPoint.proceed();
        System.out.println("After invoking method: " + proceedingJoinPoint.getSignature().getName() + ", result: " + result);
        return result;
    }
}

在该示例中,@AfterReturning注解表示在方法执行后打印方法名和返回值。而@Around注解则表示在方法执行前后打印日志,并且通过proceed()方法继续执行原始方法,并且可以获取返回值。

四、切面表达式生效

在Spring AOP中,只有通过@Pointcut注解声明的方法才能被其他切面方法调用。下面是一个示例:

@Aspect
public class LogAspect {
    @Pointcut("@annotation(com.example.demo.annotation.Log)")
    public void logPointcut() {}
    @AfterReturning(value = "logPointcut()", returning = "result")
    public void afterLog(JoinPoint joinPoint, Object result) {
        System.out.println("After invoking method: " + joinPoint.getSignature().getName() + ", result: " + result);
    }
}

在该示例中,通过@Pointcut注解声明一个logPointcut()方法,在其他切面方法中可以使用logPointcut()方法。

五、二元函数切面的表达式

二元函数切面表示同时匹配两个或多个切点的情况。在Spring AOP中,可以使用&&、||和!符号来实现二元函数切点。下面是一个示例:

@Aspect
public class LogAspect {
    @AfterReturning(value = "logPointcut() && execution(* com.example.demo.service.UserService.*(..))", returning = "result")
    public void afterLog(JoinPoint joinPoint, Object result) {
        System.out.println("After invoking UserService method: " + joinPoint.getSignature().getName() + ", result: " + result);
    }
}

在该示例中,使用&&符号同时匹配logPointcut()和UserService的所有方法。

六、AOP切面表达式书面表达格式选取

在书写切面表达式时,应注意语法的正确性和表达式的简洁性。下面是一些书写表达式时需要注意的规则:

  • 尽量使用通配符,减少代码量。
  • 使用括号对表达式进行分组,使运算符优先级更清晰。
  • 使用点号分割包名和类名,便于阅读。
  • 使用注解、参数等限制条件来过滤切点,提高代码的可读性。

原创文章,作者:TNLCI,如若转载,请注明出处:https://www.506064.com/n/369469.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
TNLCITNLCI
上一篇 2025-04-13 11:45
下一篇 2025-04-13 11:45

相关推荐

  • int类型变量的细节与注意事项

    本文将从 int 类型变量的定义、声明、初始化、范围、运算和类型转换等方面,对 int 类型变量进行详细阐述和讲解,帮助读者更好地掌握和应用 int 变量。 一、定义与声明 int…

    编程 2025-04-29
  • 浮点型数据的细节揭秘

    一、基本概念 浮点型数据是指可以表示实数的一种数据类型。在C语言中,浮点型数据有两种类型:float(单精度浮点数)和double(双精度浮点数)。其中,float数据类型占用4个…

    编程 2025-04-25
  • Latex加粗的使用细节

    一、Latex加粗的基本使用方法 在Latex中,加粗的基本语法是使用 \textbf{要加粗的文字} 。比如下面这个例子: The \textbf{quick} brown \t…

    编程 2025-04-25
  • :Darkgray的细节探索

    一、颜色值解析 对于前端开发来说,颜色选择是一项非常常见的任务。要实现一个​​优雅的前端设计,我们需要学会如何选择恰当的颜色。在这里,我将介绍darkgray,这是一种常用的颜色,…

    编程 2025-04-24
  • 关系表达式的深度剖析

    一、关系表达式的定义 关系表达式是指在关系数据库中为实现数据的最大效用和最快速度的数据检索和存储而定义的语法,表达式中的每一个元素(关系、属性、常量等)均是数据库的基本结构。 二、…

    编程 2025-04-23
  • biba模型的细节探究

    一、无 biba模型是一种多级安全模型,它强调了完整性比机密性更为重要。在biba模型中,所有对象和主体都被赋予一个完整性级别,而更高完整性级别的主体只能读取更低完整性级别的对象。…

    编程 2025-04-22
  • QString contains:细节决定成败

    一、基本概念 QString是Qt中最为常用的字符串类,其中很重要的一个函数是contains。contains函数的作用是用于判断字符串是否包含指定的字符串,例如: QStrin…

    编程 2025-04-20
  • Java二元表达式:从基础到优化

    一、基础知识 Java二元表达式是指只有两个操作数以及一个运算符的表达式,例如1+2、a<b或 x*y 。在Java语言中,对二元表达式的处理十分重要且广泛,我们需要掌握基础…

    编程 2025-04-18
  • Cron表达式校验详解

    一、Cron表达式简介 Cron表达式是一种时间计划工具。它是由6或7个时间元素组成的字符串,用于指定时间表。 Cron触发器通常用于调度任务或批处理作业。 Cron表达式是指定执…

    编程 2025-04-12
  • 深入探究cron表达式验证

    一、验证cron表达式的重要性 1、cron表达式是一个非常常见的工具,用于定义如何在特定的间隔进行重复运行作业以及何时启动作业。 2、验证cron表达式的正确性非常重要,可以确保…

    编程 2025-02-25

发表回复

登录后才能评论