2. 写一个运用SpringAOP的程序,要求通过方法开始前,和方法开始后两个切点,统计目标对象中某方法的运行时间。
时间: 2024-10-13 09:06:30 浏览: 20
Spring中IOC和AOP的详细解释共1页.pdf.zi
在Spring AOP(Aspect Oriented Programming,面向切面编程)中,我们可以创建一个切面(Aspect)来实现方法执行前后的时间统计。下面是一个简单的例子,我们将使用Spring的`@Before`和`@AfterReturning`注解。
首先,定义一个切面类`TimingAspect`:
```java
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class TimingAspect {
// 方法开始前的切点
@Before("execution(* com.example.service.MyService.*(..))")
public void beforeMethod(ProceedingJoinPoint joinPoint) {
long startTime = System.currentTimeMillis();
System.out.println("Method execution started at: " + startTime);
}
// 方法执行后的切点,计算并打印执行时间
@Around("execution(* com.example.service.MyService.*(..))")
public Object afterReturningMethod(ProceedingJoinPoint joinPoint) {
try {
// 执行原方法
Object result = joinPoint.proceed();
// 获取结束时间并计算运行时间
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
System.out.printf("Method '%s' executed in %d milliseconds%n", joinPoint.getSignature().getName(), elapsedTime);
return result;
} catch ( Throwable e ) {
// 输出异常信息
e.printStackTrace();
throw e; // 或者你可以选择如何处理异常
}
}
}
```
在这个例子中,`MyService`是你想要监控的方法所在的服务类。`execution(* com.example.service.MyService.*(..))`是一个切入点表达式,它匹配`MyService`包下的所有公共方法。
阅读全文