Запуск функции до и после доступа к нескольким JpaRepositories - PullRequest
0 голосов
/ 18 марта 2020

У меня есть несколько интерфейсов, которые аннотированы @Repository и расширяют JpaRepository. Все они находятся в одном пакете в моем проекте.

@Repository
public interface CustomerRepository extends JpaRepository<CustomerDTO>{
    List<CustomerDTO> findByKeyCustomerId(long customerId);
    List<CustomerDTO> findByKeyCustomerIdAndName(long customerId, String name);
}

@Repository
public interface UpdateRepository extends JpaRepository<UpdateDTO> {
  @Query(value = "select nextval('sq')", nativeQuery = true)
  Integer getNextUpdateId();
}

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

customerRepository.findByKeyCustomerId(customerId);
customerRepository.save(customerEntry);
updateRepository.getNextUpdateId();
updateRepository.save(updateEntry);

Я хочу вызывать один и тот же метод перед всеми этими вызовами выше и вызывать другой такой же метод после этих вызовов.

private void before(Span span) {
   span.annotate("Before");
}

private void after(Span span) {
   span.annotate("After");
}

Я хочу смоделировать следующий код:

span.annotate("Before");
Integer updateId = updateRepository.getNextUpdateId(); //can be any other repository method
span.annotate("After");

Как я могу добиться этого в общем c пути, без вставки до (span) и после (span) везде в коде, где я вызываю методы интерфейсов репозитория?

1 Ответ

2 голосов
/ 18 марта 2020

Это похоже на типичный случай, когда вы можете реализовать аспектно-ориентированное программирование (AOP). Если вы используете пружинную загрузку, вам будет очень легко реализовать ее. Для начала вы можете проверить эту ссылку: - https://www.springboottutorial.com/spring-boot-and-aop-with-spring-boot-starter-aop

Возможно, вам придется немного его настроить, чтобы добиться того, чего вы ожидаете. Но кажется выполнимым.

...