Я пытаюсь получить представление о том, когда вызывается каждый метод DAO.
У нас есть сотни методов в десятках интерфейсов, поэтому добавление журналов для каждого вызова по отдельности непрактично.
Я надеялся использовать рекомендации AOP, основанные на аннотациях JDBI в интерфейсе методы. У нас есть совет @annotation для некоторых методов контроллера, который работает хорошо, но тот же подход не работает для методов DAO.
Я подозреваю, что это связано с тем, что и Spring AOP, и JDBI работают путем создания прокси-классов на основе интерфейса, так что JDBI может получить экземпляр и использовать его для взаимодействия с базой данных, но мой аспект не может «видеть» этот экземпляр, чтобы применить совет. Я новичок в этом деле и все еще разбираюсь в деталях.
Пример проекта на GitHub: https://github.com/Vaent/jdbi-aop-example
Пример фрагментов кода (упрощенный):
Код: Выделить всё
@Service
public class MyService {
@Autowired
private Jdbi jdbi;
public Long getCount() {
// MyDAO#getCount is invoked as expected
return jdbi.onDemand(MyDAO.class).getCount();
}
}
Код: Выделить всё
public interface MyDAO {
@SqlQuery("SELECT COUNT(*) FROM myschema.mytable")
public Long getCount();
}
Код: Выделить всё
@Aspect
@Component
public class MyAspect {
@Before("@annotation(sqlQuery)")
public void queryAdvice(SqlQuery sqlQuery) {
// When the service method is invoked, I expect this to be printed, but nothing happens
System.out.println("Executing query: " + sqlQuery.value());
}
}
Есть ли обходной путь или способ настроить аспект/интерфейс так, чтобы расширение JDBI по требованию могло взаимодействовать с AspectJ/Spring AOP/любой другой аспектно-ориентированной платформой?
Подробнее здесь: https://stackoverflow.com/questions/798 ... t-oriented
Мобильная версия