1. Quarkus Interceptor 简介

Quarkus 使用 Jakarta EE 的拦截器(Interceptor)机制来实现方法级别的横切关注点。通过定义自定义注解和拦截器类,可以轻松地在方法调用前后插入逻辑。
与Spring AOP相比:
优点:基于 Jakarta EE 标准,与 Quarkus 深度集成,配置简单且性能优越。
适用场景:适合微服务架构下的轻量级应用。
Spring AOP:
优点:功能强大,支持更灵活的切入点表达式和丰富的功能。
适用场景:适合复杂的 Spring 应用。

1.1 自定义注解

首先,定义一个自定义注解 @Log,用于标记需要被拦截的方法或类。

Log.java

package org.acme.interceptor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import jakarta.interceptor.InterceptorBinding;

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR})
@Inherited
public @interface Log {
}

作用:@Log 是一个自定义注解,用于标记需要被拦截的方法或类。
关键点:
@InterceptorBinding 表示这是一个拦截器绑定注解。
@Retention(RetentionPolicy.RUNTIME) 表示该注解在运行时可用。
@Target 定义了该注解可以应用于类、方法或构造函数。

1.2 拦截器类

接下来,定义一个具体的拦截器类 LogInterceptor,负责在方法调用前后记录日志。

LogInterceptor.java

package org.acme.interceptor;

import org.jboss.logging.Logger;

import jakarta.interceptor.AroundInvoke;
import jakarta.interceptor.Interceptor;
import jakarta.interceptor.InvocationContext;

@Log
@Interceptor
public class LogInterceptor {
    private static final Logger logger = Logger.getLogger(LogInterceptor.class);

    /**
     * 拦截方法调用,记录方法调用前、后以及异常情况的日志。
     *
     * @param context 调用上下文
     * @return 目标方法的返回值
     * @throws Exception 如果目标方法抛出异常,则抛出该异常
     */
    @AroundInvoke
    public Object logMethodInvocation(InvocationContext context) throws Exception {
        // 记录方法调用前的日志
        logger.infov("Before invoking method on {0}", context.getTarget().getClass().getSimpleName());

        try {
            // 调用目标方法
            Object result = context.proceed();
            // 记录方法调用后的日志
            logger.infov("After invoking method on {0}", context.getTarget().getClass().getSimpleName());
            return result;
        } catch (Exception e) {
            // 记录方法调用中的异常日志
            logger.errorv("Exception occurred while invoking method on {0}: {1}", context.getTarget().getClass().getSimpleName(), e.getMessage());
            throw e;
        }
    }
}

作用:LogInterceptor 是一个具体的拦截器实现,负责在方法调用前后记录日志。
关键点:
@Log 和 @Interceptor 标记该类为一个拦截器。
@AroundInvoke 方法是拦截器的核心逻辑,context.proceed() 调用了目标方法。

1.3 使用方式

在需要拦截的方法或类上添加 @Log 注解。
Quarkus 会自动将 LogInterceptor 应用于所有标记了 @Log 的方法。
示例

package org.acme.service;

import org.acme.interceptor.Log;

@Log
public class MyService {

    public void doSomething() {
        // 业务逻辑
    }

} 

代码示例下载(https://gitee.com/boywangxj/quarkus-interceptor-quickstarts.git)

posted on 2025-03-19 10:38  爱吃青菜的虫子  阅读(49)  评论(0)    收藏  举报