Применять аспект только к аннотированным методам, использующим AspectJ (без Spring) - PullRequest
0 голосов
/ 31 августа 2018

Я хочу использовать аспекты в Java, которые имеют некоторые ограничения ресурсов, поэтому я не могу использовать аспекты Spring из-за большого объема памяти.

Так что я хочу обойтись без Spring, это создать собственную аннотацию, которая вызовет аспект у аннотированных методов.

У меня есть некоторая реализация, но я не вижу запуска Apect при запуске метода. Вот что у меня есть:

Моя пользовательская аннотация

 @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation {}

Где используется аннотация

@MyCustomAnnotation
     public void someMethod() {
        System.out.println("Method runnning...");
     }

Аспект, который я создал

@Aspect
public class MyAspect {

    @Pointcut("execution(* *(..))")
    public void callAt() {}

    @Around(("callAt()"))
    public void doSomething(ProceedingJoinPoint point)  {
      point.proceed();
      System.out.println("Aspect is runnning...");
}

Конфигурации, которые есть в моем файле Gradle

dependencies {
        classpath "gradle.plugin.aspectj:gradle-aspectj:0.1.6"
    }

apply plugin: 'aspectj-gradle'

    compile 'org.aspectj:aspectjrt:1.9.1'
    compile 'org.aspectj:aspectjweaver:1.9.1'

Понятия не имею, почему аспект не запускается, я не вижу сообщения об этом аспекте в консоли, когда приложение запускается. Есть идеи, что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

В какой-то момент аспект должен быть «сплетен» с классами, чтобы они могли работать. Это можно сделать в время выполнения или время компиляции время.

Я бы фактически предложил вам использовать время компиляции, так как я думаю, что это значительно упрощает использование aspectj (я уже довольно успешно использовал время компиляции).

Вам просто нужно найти и настроить плагин gradle для этого (я использую maven).

0 голосов
/ 11 сентября 2018

Вы пробовали что-то вроде:

@Around("@annotation(mycustomannotation.package.MyCustomAnnotation)")

где mycustomannotation.package.MyCustomAnnotation - интерфейс созданной вами аннотации

0 голосов
/ 01 сентября 2018

Этот аспект не имеет отношения к вашей аннотации, но я понимаю, что вы сначала попробовали простейший pointcut.

Когда ваш совет возвращается void, он может перехватывать только те методы, которые также возвращают void. Возможно, вы пытаетесь перехватить методы с другими типами возвращаемых данных, хотя я могу только предполагать, что вы не передали свой целевой код. Убедитесь, что округлый совет возвращает Object (или любой тип возврата, используемый вашими целевыми методами), а результат proceed() возвращается советом.

Кстати, ваше решение не использовать Spring только из-за его "AOP lite" инфраструктуры Spring AOP было хорошим, AspectJ гораздо более мощный и эффективный. Было бы безумно использовать Spring только из-за ограниченных возможностей АОП. Я действительно не знаю, почему люди в первую очередь думают о Spring AOP, когда речь идет о AOP в Java, а не об AspectJ.

...