我创建了一个自定义注释,用于记录方法的执行情况。看起来像这样:
注释声明:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
方面:
@Aspect
@Component
public class LogExecutionTimeAspect {
@Around("@annotation(com.example.app.LogExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
final long startedAt = System.currentTimeMillis();
final Object proceed = joinPoint.proceed();
final long duration = System.currentTimeMillis() - startedAt;
System.out.printLn(joinPoint.getSignature() + " - " + duration);
return proceed;
}
}
注释用法:
public class UsersStore {
private final UsersRepository usersRepository;
public UsersStore(UsersRepository usersRepository) {
this.usersRepository = usersRepository;
}
@LogExecutionTime
public List<User> findAll() {
return usersRepository.findAll();
}
@LogExecutionTime
public Integer countAll() {
return usersRepository.countAll();
}
}
但是,当前的实现意味着我必须将此注释应用于所有公共方法。需要重复很多代码。而且由于我想监视存储库中所有公共方法的执行时间,因此我想可能会有更好的方法。
我想实现的是在类级别的单个注释,该注释测量类中每个公共方法的执行时间。
我发现ElementType.TYPE
应该用于某个类,但我不知道如何使用它。基本上,我想要的是:
@LogEachMethodExecutionTime // <--- What is the appropriate implementation?
public class UsersStore {
private final UsersRepository usersRepository;
public UsersStore(UsersRepository usersRepository) {
this.usersRepository = usersRepository;
}
public List<User> findAll() {
return usersRepository.findAll();
}
public Integer countAll() {
return usersRepository.countAll();
}
}
有什么主意吗?