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)
浙公网安备 33010602011771号