springboot写一个添加aop日志的自定义注解实例(入门)

news/2024/12/5 8:14:16/

以下是一个使用Spring Boot编写的自定义注解示例,用于添加AOP日志功能:

创建一个自定义注解 Loggable,用于标记需要添加AOP日志的方法。
java Copy code
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
}
创建一个切面类 LoggingAspect,用于在被 Loggable 注解标记的方法执行前后添加日志记录。
java Copy code
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.stereotype.Component;

import java.util.logging.Logger;

@Aspect
@Component
public class LoggingAspect {

    private Logger logger = Logger.getLogger(LoggingAspect.class.getName());

    @Before("@annotation(com.example.Loggable)")
    public void logMethodExecution(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        logger.info("Executing method: " + methodName);
    }

    @AfterReturning(pointcut = "@annotation(com.example.Loggable)", returning = "result")
    public void logMethodReturnValue(JoinPoint joinPoint, Object result) {
        String methodName = joinPoint.getSignature().getName();
        logger.info("Method " + methodName + " returned: " + result);
    }
}
在需要添加日志的方法上添加 @Loggable 注解。
java Copy code
@Service
public class ExampleService {

    @Loggable
    public void doSomething() {
        // Method implementation
    }

    @Loggable
    public String calculateResult(int a, int b) {
        // Method implementation
        return "Result";
    }
}
在上述示例中,我们创建了一个切面类 LoggingAspect,通过 @Before 和 @AfterReturning 注解来定义在被 Loggable 注解标记的方法执行前后要执行的逻辑。切面类会记录方法的名称,并使用Java日志进行输出。

在 ExampleService 类中,我们在 doSomething 和 calculateResult 方法上添加了 @Loggable 注解,这样就会触发切面类中定义的日志记录逻辑。

当调用被 @Loggable 注解标记的方法时,将会在控制台输出相关的日志信息,包括方法的名称和返回值(在返回类型不为 void 的情况下)。

你可以根据实际需求扩展该示例,并在切面类中添加自己所需要的日志记录逻辑。

注解 @Before("@annotation(com.example.Loggable)") 是切面类中的一个方法级别的切点表达式,它被用于定义在被 Loggable 注解标记的方法执行前执行的逻辑。

具体解释如下:

@Before: 这是一个 AspectJ 切面注解,表示该方法将在目标方法执行之前执行。
"@annotation(com.example.Loggable)": 这是切点表达式,指定了要拦截的目标方法。其中,@annotation() 用于匹配带有特定注解的方法,而 com.example.Loggable 是我们自定义的注解类。
因此,当使用 @Before("@annotation(com.example.Loggable)") 注解一个方法时,这个方法就会在所有被 Loggable 注解标记的方法执行之前执行。在该方法内部,你可以编写相应的代码,实现自定义的日志记录逻辑或其他操作。

总结起来,@Before("@annotation(com.example.Loggable)") 注解告诉AOP框架,在被 Loggable 注解标记的方法执行前,执行当前方法的逻辑。


http://www.ppmy.cn/news/1270864.html

相关文章

pytest + yaml 框架 -59.用例失败重跑机制pytest-rerunfailures

前言 有些接口可能不太稳定,第一次跑的时候由于网络原因或者其它原因失败,但是重新跑2次又成功了。 对于这种需要重新跑几次的场景,可以使用用例失败重跑机制,需安装pytest-rerunfailures 插件。 场景示例 失败重跑需要依赖 py…

vue 打包报错

最近搞低代码大屏使用goview打包时遇到问题 报错&#xff1a; vite v4.3.6 building for production... transforming (8931) node_modules\monaco-editor\esm\vs\base\common\navigator.js <--- Last few GCs ---> [24864:000001B515BA39F0] 65979 ms: Scavenge 2002.0…

3D点云广义零样本分类的递归循环对比生成网络笔记

1 Title Contrastive Generative Network with Recursive-Loop for 3D point cloud generalized zero-shot classification(Yun Hao, Yukun Su, Guosheng Lin, Hanjing Su, Qingyao Wu)【Pattern Recognition】 2 Conclusion This work aims to facilitate research on 3D poi…

QEMU源码全解析 —— virtio(8)

接前一篇文章&#xff1a; 上一回讲解了virtio balloon相关类所涉及的realize函数&#xff0c;如下表所示&#xff1a; realize函数parent_dc_realize函数DeviceClassvirtio_pci_dc_realizePCIDeviceClassvirtio_pci_realizeVirtioPCIClassvirtio_balloon_pci_realizepci_qdev…

facebook的营销方式

Facebook现在有很多种营销方式&#xff0c;以下是一些常见的方式&#xff1a; 1. 广告投放&#xff1a;可以通过Facebook广告平台进行广告投放&#xff0c;根据不同的目标人群、地理位置和兴趣进行精准定向投放&#xff0c;包括图片广告、视频广告和文字广告等。 2. 社群营销…

WPF(Windows Presentation Foundation)的 ToolBar控件

WPF&#xff08;Windows Presentation Foundation&#xff09;的 ToolBar 是一种用于创建工具栏的控件。 工具栏通常位于应用程序窗口的顶部或侧边&#xff0c;并提供了一组常用的工具按钮或命令&#xff0c;用于执行特定的操作或访问特定的功能。 ToolBar 控件是 WPF 中的一个…

Tekton 基于 cronjob 触发流水线

Tekton 基于 cronjob 触发流水线 Tekton EventListener 在8080端口监听事件&#xff0c;kubernetes 原生 cronjob 定时通过curl 命令向 EventListener 发送事件请求&#xff0c;触发tekton流水线执行&#xff0c;实现定时运行tekton pipeline任务。 前置要求&#xff1a; kub…

【Flink on k8s】 -- flink kubernetes operator 1.7.0 发布

目录 前言 重大特性 1、自动伸缩 2、版本支持 3、savepoint 触发改进 4、jdk 支持 前言 Flink 官方博客于 2023-11-22 发布了 flink kubernetes operator 1.7.0 发布的消息。这个版本对自动缩放进行了大量的改进&#xff0c;包括与 Kubernetes 的完全分离&#xff0c;以便…