Как обернуть все вызовы репозитория аспектом Around - PullRequest
0 голосов
/ 07 января 2020

Я хотел бы обернуть все вызовы репозитория в моем сервисе аспектом Around для создания некоторых метрик.

Все мои JpaRepositories помечены org.springframework.stereotype.Repository, поэтому я попробовал что-то вроде этого:

@Configuration
@Aspect
public class RepositoryMetrics {

    @Around("@annotation(org.springframework.stereotype.Repository)")
    public void logQueryTime(ProceedingJoinPoint joinPoint) throws Throwable {
        //Some logic here
        joinPoint.proceed();
        //Some logic here
    }
}

Но похоже, что метод аспекта никогда не запускается. Что мне не хватает?

1 Ответ

1 голос
/ 08 января 2020

Если у вас есть классы JpaRepository, аннотированные следующим образом

@Repository
public interface JpaEmployeeRepository extends CrudRepository<JpaEmployee, Long> {
...
}

Следующий аспект будет перехватывать все вызовы методов, происходящие с этим классом

@Component
@Aspect
public class RepositoryAspect {

    @Pointcut("@within(org.springframework.stereotype.Repository)")
    public void repositoryAnnotationPointCut() {}

    @Around("repositoryAnnotationPointCut()")
    public void logQueryTime(ProceedingJoinPoint pjp) throws Throwable {

        System.out.println("logged for "+pjp.toLongString());
        pjp.proceed();
    }
}

Обратите внимание, что класс конфигурации лучше оставить для записей конфигурации, и вы можете создать отдельный класс для Aspect и аннотировать его с помощью @Component, как указано в примере.

Убедитесь, что у вас есть @ComponentScan для автоматического определения аспекта и @EnableAspectJAutoProxy в классе конфигурации. Что-то вроде следующего:

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackageClasses= {RepositoryAspect.class})
public class AppConfig {
...
}

Обновление

Ниже приведены причины, по которым ваш код не работал должным образом

1.

Обозначение точки резки @annotation

@ annotation: Ограничения, совпадающие с точками соединения, где объект точки соединения ( метод выполняется в Spring AOP ) имеет заданную аннотацию.

В этом случае метод не аннотируется.

2.

Класс конфигурации RepositoryMetrics не помечен @ EnableAspectJAutoProxy . Я предполагаю, что Spring AOP не был включен ни в одном из классов конфигурации.

...