Как стать автором
Обновить

Комментарии 15

Как-то неожиданно оборвалось повествование
В 3 ночи захотелось спать) К тому же я не претендую на монографию. Примеры будут в следующих статьях
Что по, вашему мнению, стоило бы рассказать еще про основы?
Суть то понятна, хотелось бы увидеть примеры решения задач с сабжем и без (т.е. чтобы оценить профит). Я «краем глаза» уже сталкивался с AspectJ в одном проекте, но заметного профита заметить не удалось.
Я вас понял. Есть задачи по тестированию, которые без АОП сделать можно только самостоятельно модифицируя байткод приложения или написав кодогенератор для исходников. осмотрите статью по ссылке. По-моему показательно как можно добраться в потроха плагина
Какие примеры были бы интересны? В следующих публикациях постараюсь учесть
Проблема, с который мы недавно столкнулись и которую пробовал решить с помощью аспектов — логгирование CallableStatement. Т.е. стандартный код:
CallableStatement c = con.createCallableStatement("{call package.procedure(?,?,?,?)}");
c.setString(1,"a");
c.setInteger(2,2);
c.setStruct(3,struct);
c.execute();

И я пробовал с помощью аспектов получить {call package.procedure(?,?,?,?)} и потом отследить вызов set методов с логгированием переданных параметров и при вызове execute() записывать эти параметры в лог.
В итоге не осилил — при включении аспектов на нашем проекте компиляция стала занимать какое-то нереальное время. И пошёл по другому пути — сделал wrapper вокруг connection, а он возвращает wrapper вокруг CallableStatement который уже производит логгирование. Кода получилось очень мало — большая часть кода wrapper была сгенерирована IDEA, а я в итоге написал сохранение параметров в set методах и вывод их в лог при выполнении execute().

Но мне бы было интересно, если бы Вы показали на этом примере, как можно применить аспекты.

Успешный пример их применения у меня был на гораздо меньшем проекте — там нужно было логировать просто время выполнения определённых методов (проект был по нагрузочному тестированию). И там было всё гораздо проще — написал pointcut для поиска этих методов, сохранял текущее время, вызывал метод, писал разницу между текущим временем и сохранённым.

Но в примере с CallableStatement по другому — нужно не просто подменить вызов метода своим, а ещё и отследить что вызывались set методы у объекта и отследить вызов exceute().

P.S. Спасибо за статьи по аспектам!
Отличная задача)
Такое решал с помощью ThreadLocal. Напишу пример
Почти ваше решение с wrapper: habrahabr.ru/post/266781
C ThreadLocal так и не добрался, но помню(
Мы сейчас пишем примерно так (язык Scala):

class SomeClass {
  def someMethod = measure("SomeClass.someMethod") {
     // ...
  }
}


А хотелось бы:

class SomeClass {
  def someMethod = measure {
     // ...
  }
}


И чтобы в метод measure передавалось имя класса и имя метода. Пробовали извлекать их из стэктрейсов, но при нагрузочном тестировании из-за этого возникают постоянные блокировки, производительность просаживается. Было бы интересно посмотреть, как решить проблему с помощью AOP.
Со Scala я года 3 как не сталкивался. Если бы вы сделали простой тест и проект дня него на SBT/maven, то я бы попробовал бы решить эту задачу
AspectJ — это очень хорошо, используем в проекте для сборка метрик и трассировки в распределенном приложении (через библиотеку Kamon). Не представляю, как бы жили без него.

С нетерпением жду новых постов, посвященных AOP!
Смотрел на kamon — интересный проект. Из разработчиков видел комиты наших соотечественников. В моем проекте на гитхабе есть зависимость на их артефакт — перепакованный sigar с нативными библиотеками внутри

Не нашел в статье объяснения самой сути АОП для новичка.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории