📜  Spring AOP AspectJ注释示例(1)

📅  最后修改于: 2023-12-03 15:05:15.541000             🧑  作者: Mango

Spring AOP AspectJ注释示例

在Spring AOP中,AspectJ注释是声明式切面编程的一种方式。它提供了简单易懂的方式来定义切面和切点。下面,我们将介绍AspectJ注释的语法和示例。

AspectJ注释语法

AspectJ注释是由Java注释形式的切面定义组成的,用于描述切面的类型、连接点、切点和通知。AspectJ注释使用@Aspect注释来定义切面。在切面类中,我们可以使用以下注释来定义切点和通知:

切点注释
  • @Pointcut:定义切点,它是一个可重用的基础连接点集合。切点通常使用方法定义,但也可以使用其他的切点定义方法来定义。
  • @Around:定义环绕通知,它在方法执行之前和之后提供增强功能。环绕通知可以调用ProceedingJoinPoint来执行切点。
通知注释
  • @Before:在连接点执行之前执行通知。
  • @After:在连接点执行之后执行通知。
  • @AfterReturning:在连接点正常执行完毕之后执行通知。
  • @AfterThrowing:在连接点抛出异常之后执行通知。
AspectJ注释示例

下面是一个简单的AspectJ注释示例,它用于记录方法执行时间:

@Aspect
@Component
public class LogExecutionTimeAspect {

    private static final Logger LOGGER = LoggerFactory.getLogger(LogExecutionTimeAspect.class);

    @Pointcut("execution(* com.example.demo.service.*.*(..))")
    public void serviceMethod() {}

    @Around("serviceMethod()")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();
        long endTime = System.currentTimeMillis();

        LOGGER.info(joinPoint.getSignature() + " executed in " + (endTime - startTime) + " ms");
        return proceed;
    }
}

在此示例中,我们定义了一个切点serviceMethod(),它将匹配com.example.demo.service包中的所有方法。然后,我们定义一个环绕通知logExecutionTime(),它将记录方法执行时间并输出日志。

需要注意的是,使用AspectJ注释时需要将切面定义为一个Spring bean,因此我们使用了@Component注释来标记这个类。

结论

使用AspectJ注释是一种简单和方便的声明式切面编程方式,它提供了清晰易懂的语法,并使切面定义具有更好的可重用性。如果您需要为方法添加增强功能,那么可以尝试使用AspectJ注释。