1.定义事件类型
public class LogEvent {
}
2.定义日志切面注解
import jakarta.interceptor.InterceptorBinding;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@InterceptorBinding
public @interface Loggable {
String value() default "";
}
3.拦截器操作,并发布日志事件
import jakarta.enterprise.event.Event;
import jakarta.enterprise.inject.Any;
import jakarta.inject.Inject;
import jakarta.interceptor.AroundInvoke;
import jakarta.interceptor.Interceptor;
import jakarta.interceptor.InvocationContext;
import lombok.extern.slf4j.Slf4j;
@Interceptor
@Loggable
@Slf4j
public class LogInterceptor {
@Inject
@Any
Event<LogEvent> event;
/**
*
*/
@AroundInvoke
public Object around(InvocationContext context) throws Exception {
Loggable loggableAnnotation = context.getMethod().getAnnotation(Loggable.class);
String logMessage = loggableAnnotation.value(); // Get the value of the parameter
log.info("Entering method: {}", context.getMethod().getName());
log.info("Log message: {}", logMessage);
log.info("Exiting method: {}", context.getMethod().getName());
Object result;
long beginTime = System.currentTimeMillis();
result = context.proceed();
// 执行时长(毫秒)
long time = System.currentTimeMillis() - beginTime;
log.info("执行时长: {} 毫秒", time);
event.fire(new LogEvent());
return result;
}
}
4.观察捕获事件
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
@ApplicationScoped
public class EventSubscriber {
public void onEvent(@Observes LogEvent event) {
System.out.println("Received event: " + event);
}
}