2015-12-03 2 views
-1

Я успешно использовал AOP с приложениями Spring, но на удивление я застрял в простом проекте java. теперь я пытаюсь реализовать очень простое приложение AOP java, но оно не работает. Вот основные классы:AOP на простой Java-приложении

import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 

@Aspect 
public class MySimpleLoggerAspect { 

    @Around("@annotation(TimeableMetric)") 
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable { 
     System.out.println("myTrace:before call "); 

     Object retVal = null; 
     try { 
      retVal = joinPoint.proceed(); 
     } finally { 
      System.out.println("myTrace:after call "); 
     } 
     return retVal; 
    } 
} 

public class SampleClass { 

    @TimeableMetric 
    public String doService(String in){ 
     System.out.println("inside Service"); 
     return in; 
    } 
} 

public class Tester { 
    public static void main(String[] args) { 
     System.out.println(new SampleClass().doService("Hello World")); 
    } 
} 


import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD, ElementType.TYPE}) 
public @interface TimeableMetric { 

} 

Как вы можете видеть, это очень простое приложение с 4 классами. IntelliJ обнаруживает, что AOP рекомендует правильно, но он игнорируется при запуске приложения. Я уверен, что есть ошибка, которую я просто не могу обнаружить. Пожалуйста, помогите!

+0

Вы написали этот код и попытались его запустить (покажите нам, как вы его запускаете). Почему вы так написали его и запускаете его любым способом и ожидаете, что он сделает то, что вам нужно? (Ответы на эти вопросы указывают на то, что вы изучали использование AspectJ.) –

+0

Я могу написать его с помощью конфигурации aop.xml, но я думаю, что он не является мобильным. Поэтому я предпочитаю использовать аннотации, чтобы указать методы, рекомендованные методом. Почему я это реализую? Потому что что-то подобное работало в рамках проекта Spring-boot. Как я его запускаю? Из основного метода. –

+0

Значит, вы просто «java Tester»? –

ответ

1

код нормально, для меня журнал консоли выглядит следующим образом:

myTrace:before call 
myTrace:before call 
inside Service 
myTrace:after call 
myTrace:after call 
Hello World 

Возможно вы использовали от Spring AOP получить только один перехват за срезом точек @annotation(TimeableMetric), но в противоположном Spring AOP только зная execution() pointcuts, AspectJ также поддерживает call() pointcuts. Так что если вы измените Pointcut на @annotation(TimeableMetric) && execution(* *(..)), журнал становится:

myTrace:before call 
inside Service 
myTrace:after call 
Hello World 

Что касается вопроса, как получить прикладные аспекты, вы должны

  • скомпилировать приложение с AspectJ компилятором AJC и затем
  • запустите его со временем выполнения AspectJ aspectjrt.jar на пути к классам.
+0

Спасибо Kriegaex, было очень полезно. Я сконфигурировал свой IntelliJ для компиляции с использованием Ajca и отлично работает! –

Смежные вопросы