Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

AOP in action. AspectJ (CTW) Spring LTW

Anna | 5.06.2014 | нет комментариев

Решил внедрить АОП логирование на план и не внедрил. Как и отчего, собственно и хочу поделиться.

Я не буду описывать суть и тезисы АОП, а опишу только те задачи, с которыми я столкнулся, и решения которых заняло много времени.
У меня было в распоряжении Spring, WebLogic, google.com и план, куда я хотел внедрить АОП логирование. Скажу сразу, до этого я никогда не работал с АОП.

Задача № 1

Spring AOP – использует proxy-based подход. 

Если у нас есть класс (СlassA) с способами (methodA, methodB), при этом methodB() вызывает methodA() и аспект (возможен after) тот, что должен выполняться при вызове methodA():

public class ClassA {

    public void methodA() {
        System.out.println("methodA");
    }

    public void methodB() {
        System.out.println("methodB");
        methodA();
    }
}

public class AspectClass {
    public void aspectMethodA() {
        System.out.println("Aspect on method A");
    }
}

И некоторый класс тот, что в рамках какой-то логики делает вызов этих способов:

public void execute() {
        // ..... 
        classA.methodA();
        classA.methodB();
        // ..... 
    }

Итог такого вызова (применяя типовой Spring AOP) будет:

methodA
Aspect on method A
methodB
methodA

И все, 2-й раз аспект не сработает. В документации отлично описан правило работы Spring-AOP, прочитав его, все встает на свои места. Это отправная точка.

Задача № 2

Способы обязаны быть public. Здесь без комментариев.

Так вот, почитав документацию и иную познавательную литературу я обнаружил следующее решение:

  • Load-time weaving (LTW).
  • Compile-time weaving (CTW).

От того что я обнаружил отличную документацию по LTW, я решил применять именно его. Цена вопроса:

  1. Сейчас у нас нет одного .xml файла, куда мы прекрасно складываем наши pointcut-ы, aspect-ы.
  2. Необходимо добавить новейший aop.xml, где мы обязаны указать наши weaver-ы (классы которые непринужденно учувствуют в процессе), aspects-ы.
  3. Pointcut-ы тепер указываются непринужденно над aspect-ами.
    @Before( "execution(*  com.solutions. web.test.WebTestClass.testA())")
        public void testALog() {}
    
  4. Над классами аспектов возникает аннотация @Aspect.
  5. Необходимо добавить довод при запуске JM/WebLogic:
    -javaagent:${PATH_TO_LIB }/aspectjweaver.jar
    

 

Примечание

Если посмотреть на пример приведенный в документации (aop.context):

     <weaver>
        <include within="foo.*"/>
    </weaver>

    <aspects>
        <aspect name="foo.ProfilingAspect"/>
    </aspects>

Да все работает, но одно НО — мы редко будем беречь наш исполняющий код и непринужденно код аспектов в одном классе/пакете. Эту маленькую деталь они упустили в изложении. Так вот, если у нас есть класс (ClassA) и аспект (AspectA) которые находятся в различных пакетах, то валидной конфигурацией будет дальнейший aop.xml:

    <weaver>
        <include within="com.example.ClassA"/> <!-- путь к определенному классу -->
        <include within="com.log.* "/> <!—путь к пакету с аспектами>
    </weaver>

    <aspects>
        <aspect name="com.log.AspectA"/>
    </aspects>

В теге <weaver> следует указать все классы к которым будут применены аспекты пакет со всеми аспектами.

Задача № 3

LTW невозможно применитьна EAR/APP ярусе. 

«As Costin said, there is unfortunately nothing we can do about this. Load-time weaving only works for specific deployment units such as WARs, and even there it is considered an advanced feature that won’t work in all runtime environments.”

Реально данный комментарий я искал дюже длинно.

Решением этой задачи как вы додумались, и является применение CTW. Цена вопроса:

  1. Огромнее нет хоть какого-то конфигурационного файла, где мы можем посмотреть все наши aspect-ы и pointcut-ы.
  2. Cкладывая АОП систему логирования в один пакет дозволено обнаружить все pointcut-ы, но все равно это неудобно и занимает много времени.
  3. Необходимо применять ajc-компайлер, соответственно подключать его к сборщикам плана (ant, maven, gradle…).

 

Задача № 4

CTW LTW не совместимые спецтехнологии.

Может мне легко не повезло, но по не знаменитым мне причинам LTW сканировало каждый classpath и при вызове классов скомпилированных при помощи СTW падало с оплошностью:

 java.lang.Exception: java.lang.NoSuchMethodError: com.aop.example.log.AspectA.aspectOf()Lcom/aop/example/log/AspectA;

Задача сразу же исчезает позже отключения LTW.

ИТОГО

Что я для себя перенес и хотел бы добавить:

  1. Для всех public способов верхнего яруса (EAR/APP, WEB ярус) дозволено применять Spring AOP.
  2. Для каждого WEB яруса не public и способов не верхнего яруса дозволено применять LTW (если СTW не применяется).
  3. Для каждого APP яруса не public и способов не верхнего яруса дозволено применять CTW (если LTW не применяется).
  4. В теге <weaver> файла app.context необходимо указывать как сами “weav” классы так и aspect-ы.
  5. CTW и LTW не совместимые спецтехнологии.

В финальном результате для приложения, имеющего WEB и APP ярусы, получаем план с Spring AOP CTW спецтехнологиями.
От прекрасной конфигурации в одном .xml файле не осталось и следа. Из-за специфики плана, пояснять все это клиенту я не решился и оставил эту затею для дальнейшего плана.

План

Скачать план-пример дозволено из github-a. План на maven-e.

Класс Executor является spring-bean-ом, получив его экземпляр, исполните способ execute().
Если вы все верно завели, то в итоге обязаны получить следующие сообщения:

--methodA-- method
Aspect Before for methodCTW
--methodCTW-- method
Aspect After for method A

--webMethodA-- method
Web Aspect Before  for MethodCTW
--webMethodForCTW-- method
Web Aspect After web method A

Письменность

Список литературы:

  1. Spring AOP.
  2. AspectJ.
  3. AspectJ Spring, LTW.
  4. Spring3-AOP-AspectJ-XML-Example.

Cсылки на статьи из Програ:

  1. AspectJ, Spring, Maven.
  2. Знакомство с АОП.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB