监控 Spring 方法执行的性能

x33g5p2x  于2022-09-28 转载在 Spring  
字(2.5k)|赞(0)|评价(0)|浏览(377)

本教程讨论如何使用 AspectJ 开源框架监控 Spring 应用程序在方法执行方面的性能

传统上,监控每个 Java 方法所花费的时间的最简单方法是在方法的开头和结尾包含一些跟踪行:

public void slowMethod() {
  long start = System.currentTimeMillis();
  class.method();
  long time = System.currentTimeMillis() - start;
  logger.trace("Time spent " + time);
}

如果您有很多方法可以检查哪些方法会影响您的表现,那很容易变成一场噩梦。

AspectJ技术

AspectJ 是Java 中AOP 技术的完整实现,因此它几乎可以应用于任何Java 类。这个框架的特点是方面的编织可以通过字节码修改来执行你的代码的后期编译。这与 Spring AOP 不同,在 Spring AOP 中,Aspects 的编织将由容器在容器启动时执行。

让我们看一个实际的例子。 @AspectJ 支持通过在你的 spring 配置中包含以下元素来启用:

<aop:aspectj-autoproxy />

启用 @AspectJ 支持后,在应用程序上下文中定义的任何具有 @AspectJ 方面(具有 @Aspect 注释)的类的 bean 都将被 Spring 自动检测并用于配置 Spring AOP:

package com.sample;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyProfiler {
  @Pointcut("execution(* com.sample.*.*(..))")
  public void businessMethods() {}

  @Around("businessMethods()")
  public Object profile(ProceedingJoinPoint pjp) throws Throwable {
    long start = System.currentTimeMillis();
    System.out.println("Going to call the method." + pjp.getTarget());
    Object output = pjp.proceed();
    System.out.println("Method execution completed." + pjp.getTarget());
    long elapsedTime = System.currentTimeMillis() - start;
    System.out.println("Method execution time: " + elapsedTime + " milliseconds.");
    return output;
  }
}

@Pointcut 声明有两部分:包括名称和任何参数的签名,以及确定我们正在处理的方法执行的切入点表达式。在我们的例子中,我们有兴趣捕获属于 com.sample.* 命名空间的所有类的执行。

包含的最后一个注释是 @Around。 @Around 建议“围绕”匹配的方法执行。它有机会在方法执行之前和之后进行工作,并确定该方法何时、如何甚至是否真正执行。

这就是我们在 com.sample 命名空间中监控类的时间所需的全部内容。在您的配置中包含上述 Bean 的定义:

<bean id="myProfiler" class="com.sample.MyProfiler" />

最后,添加以下依赖项来构建您的应用程序:

<?xml version="1.0" encoding="UTF-8"?><project>
   <dependency>
           
      <groupId>org.springframework</groupId>
           
      <artifactId>spring-core</artifactId>
           
      <version>${spring.version}</version>
       
   </dependency>
    
   <dependency>
           
      <groupId>org.springframework</groupId>
           
      <artifactId>spring-context</artifactId>
           
      <version>${spring.version}</version>
       
   </dependency>
     
   <!-- AOP -->
    
   <dependency>
           
      <groupId>org.springframework</groupId>
           
      <artifactId>spring-aop</artifactId>
           
      <version>${spring.version}</version>
       
   </dependency>
    
   <dependency>
           
      <groupId>org.aspectj</groupId>
           
      <artifactId>aspectjweaver</artifactId>
           
      <version>${aspectj.version}</version>
       
   </dependency>
</project>

相关文章

微信公众号

最新文章

更多