自定义注释应用于类中的每个方法

时间:2019-01-17 14:09:23

标签: java annotations aop

我创建了一个自定义注释,用于记录方法的执行情况。看起来像这样:

注释声明:

@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();
    }
}

有什么主意吗?

0 个答案:

没有答案