AspectJ: как ограничить аспекты - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь включить аспектное переплетение для частных методов в большом проекте с весенней загрузкой. У меня уже есть аспекты, нацеленные на публичные методы, которые работают просто отлично, но мои исследования привели меня к мысли, что аспекты Spring AOP могут взаимодействовать только с публичными методами.

Я наткнулся на этот проект, который я включил в свой код (буквально скопировав пример использования):

https://github.com/subes/invesdwin-instrument

Это имеет побочный эффект от сотен аспектов, нацеленных на запуск (в основном весенние вещи). Сообщения консоли выглядят так:

 [Xlint:cantFindType]
[AppClassLoader@277050dc] error can't determine implemented interfaces of missing type javax.servlet.Filter
when processing declare parents org.springframework.web.filter.GenericFilterBean
when processing type mungers 
when weaving

Как настроить aspectJ для работы только с теми аспектами, которые я создаю, и игнорировать остальные?

****** UPDATE ******

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

 java.lang.IllegalStateException: ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar

Нужно ли добавлять java-агенты aspectjweaver и spring-tool?

1 Ответ

0 голосов
/ 03 апреля 2019

Во-первых, проект, который вы связываете, основан на том, что вы используете Oracle JVM.
Фактически, он использует класс sun.misc.unsafe, который также сложнее использовать, начиная с JDK 9 (JPMS).

В любом случае, этот проект обнаружит файл META-INF/aop.xml, который указывает на классы, содержащие ваши аспекты.Примером содержимого этого файла может быть

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <include within="your.package.aspects.*"/>
        <include within="your.package.one.*"/>
    </weaver>
    <aspects>
        <aspect name="your.package.aspects.YourClassAspect"/>
    </aspects>
</aspectj>

Внутри тега <weaver> вы определяете, какие классы будут учитываться при ткачестве.
Затем ваши pointcuts сообщают AspectJ, какие конкретные методы нужно соткать.

Но продолжайте читать.


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

Just

  • прикрепите AspectJ aspectjweaver.jarвозможно также spring-instrument.jar, см. Документы) агент
  • определите файл aop.xml в META-INF
  • определите свои точки с помощью аннотаций
  • , если необходимо (см. документы), добавьте аннотацию @EnableLoadTimeWeaving

, и все готово.

Для дальнейшего чтениясм. AOP docs и пару вопросов, которые я задал некоторое время назад, в результате которых было обновлено документацию (см. diff ).

AspectJ LTW (ткачество) не работает с Spring Boot
Spring AOP с AspectJ - сомнения по поводу времени загрузки

...