Java 方法监控及时长打印指南

在软件开发中,监控某一方法的执行时长可以帮助你优化性能。本文旨在教会刚入行的小白如何实现“Java 监控方法打印时长”的功能。以下是流程概述:

步骤 描述
1 创建一个自定义注解 @Monitor
2 创建一个切面类,使用 AOP(面向切面编程)
3 在切面类中获取方法执行时间
4 在切面方法中打印信息
5 测试监控方法的功能

第一部分:创建自定义注解

首先,我们需要定义一个注解,用于标记那些我们希望监控的方法。

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

@Retention(RetentionPolicy.RUNTIME) // 运行时可用
@Target(ElementType.METHOD) // 作用于方法
public @interface Monitor {
}

注释:

  • @Retention(RetentionPolicy.RUNTIME) 表示该注解在运行时仍然可用。
  • @Target(ElementType.METHOD) 限定该注解只能用于方法。

第二部分:创建切面类

我们将使用 Spring AOP 来处理方法监控。接下来,我们需要创建切面类:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect // 声明这是一个切面
@Component // Spring 管理的组件
public class MonitoringAspect {

    @Around("@annotation(Monitor)") // 匹配所有使用了 @Monitor 注解的方法
    public Object monitorMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis(); // 获取方法开始执行时间
        Object result = joinPoint.proceed(); // 执行被监控的方法
        long endTime = System.currentTimeMillis(); // 获取方法结束执行时间

        long duration = endTime - startTime; // 计算方法执行时长
        System.out.println("方法: " + joinPoint.getSignature().getName() + " 执行时长: " + duration + " 毫秒");
        
        return result; // 返回方法执行结果
    }
}

注释:

  • @Around 注解用于描述环绕通知,用于在方法执行前后添加额外的行为。
  • ProceedingJoinPoint 可以让你获取有关被调用方法的上下文信息。
  • joinPoint.proceed() 会执行目标方法并返回结果。

第三部分:测试功能

我们需要创建一个简单的测试类,用来验证方法监控是否正常工作。

import org.springframework.stereotype.Service;

@Service // Spring 管理的服务组件
public class TestService {
    
    @Monitor // 使用自定义注解
    public void testMethod() throws InterruptedException {
        Thread.sleep(2000); // 模拟方法执行
        System.out.println("测试方法执行完毕");
    }
}

结果展示

在应用中测试 TestServicetestMethod(),运行后控制台将输出类似以下内容:

方法: testMethod 执行时长: 2001 毫秒
测试方法执行完毕

饼状图与类图展示

本文中简洁地用以下 Mermaid 语法展示了类之间的关系:

classDiagram
    class TestService {
        +void testMethod()
    }

    class MonitoringAspect {
        +Object monitorMethod(ProceedingJoinPoint joinPoint)
    }

    TestService --> MonitoringAspect : 使用

而监控方法的功能占比类似于以下的饼状图:

pie
    title 监控方法占比
    "监控": 30
    "非监控": 70

结尾

通过上述步骤,我们成功实现了一个简单的 Java 方法监控及时长打印功能。掌握了自定义注解以及 AOP 的用法后,你将能够为项目中的关键方法添加方法执行时长监控,有助于更好地进行性能优化。希望这些内容对你未来的开发工作有所帮助!