案例介绍
对项目进行业务层接口执行监控,测量业务层接口的执行效率
public interface AccountService {
void save(Account account);
void delete(Integer id);
void update(Account account);
List<Account> findAll();
Account findById(Integer id);
}
案例分析
- 测量接口执行效率:接口方法执行前后获取执行时间,求出执行时长
System.currentTimeMillis( ) - 对项目进行监控:项目中所有接口方法,AOP思想,执行期动态织入代码
◆ 环绕通知
◆ proceed()方法执行前后获取系统时间
代码:
@Component //创建Bean对象并放入IOC容器
@Aspect //切面声明
public class RunTimeMonitorAdvice {
//切入点,监控业务层接口
@Pointcut("execution(* com.it.service.*Service.find*(..))")
public void pt(){}
@Around("pt()")
public Object runtimeAround(ProceedingJoinPoint pjp) throws Throwable {
//获取执行签名信息
Signature signature = pjp.getSignature();
//通过签名获取执行类型(接口名)
String className = signature.getDeclaringTypeName();
//通过签名获取执行操作名称(方法名)
String methodName = signature.getName();
//执行时长累计值
long sum = 0L;
for (int i = 0; i < 10000; i++) {
//获取操作前系统时间beginTime
long startTime = System.currentTimeMillis();
//原始操作调用
pjp.proceed(pjp.getArgs());
//获取操作后系统时间endTime
long endTime = System.currentTimeMillis();
sum += endTime-startTime;
}
//打印信息
System.out.println(className+":"+methodName+" (万次)run:"+sum+"ms");
return null;
}
}