Если у вас есть классы 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 не был включен ни в одном из классов конфигурации.