2013-08-10 3 views
1

Я пытаюсь определить мой аспект как конкретный аспект, чтобы иметь возможность определять pointcuts в aop.xml без компиляции кода. Я использую LTW.Aspectj: Pointcut больше не работает, когда объявлен в aop.xml (LTW)

Когда я определяю свой poincut exp в самом классе аспект и определяю аспект как простой аспект(), он отлично работает. однако, когда я объявляю аспект как конкретный аспект и определяю pointcut в aop.xml. аспект не работает больше ... и он не попал в точку внутри моих посоветуйте больше ...

Вот код с/без бетонных аспектов:

Без конкретных аспектов (работает отлично) :

public abstract aspect AbstractAspect { 
    protected abstract pointcut publicMethod(); 
} 

public aspect MethodExecutionTimeAspect extends AbstractAspect { 
    public pointcut publicMethod() : execution(public * com.proj.package..*()); 
    Object around() : publicMethod() { 
     ..... 
     Object ret = proceed(); 
     .... 
    } 
} 

и aop.xml

<aspectj> 
    <aspects> 
    <aspect name="com.proj.packae.aspectj.MethodExecutionTimeAspect"/> 
    </aspects> 
    <weaver options="-verbose"> 
    </weaver> 
</aspectj> 

с конкретными аспектами (НЕ РАБОТАЕТ)

public abstract aspect AbstractAspect { 
    protected abstract pointcut publicMethod(); 
} 

public aspect MethodExecutionTimeAspect extends AbstractAspect { 
    public pointcut publicMethod() : execution(public * com.proj.package..*()); 
    Object around() : publicMethod() { 
     ..... 
     Object ret = proceed(); 
     .... 
    } 
} 

aop.xml

<aspectj> 
<aspects> 

    <concrete-aspect name="com.proj.package.MethodExecutionTimeAspect" extends="com.project.package.aspectj.AbstractAspect"> 
     <pointcut name="publicMethod" expression="execution(public * com.proj.package..*())" /> 
    </concrete-aspect> 

</aspects> 

<weaver options="-verbose"> 

</weaver> 

я использую AspectJ 1,6 банки.

Когда я не использую Concret-аспекты, это следующие журналы

[[email protected]] info register aspect com.project.package.aspectj.MethodExecutionTimeAspect 

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

[[email protected]] info define aspect com.project.package.aspectj.MethodExecutionTimeAspect 

не показаны никаких ошибок в журнале, это просто похоже, что конкретные аспекты не зарегистрированы.

Просьба сообщить.

+0

Я думаю, что вы забыли для добавления опции javaagent в вашу java-команду, выполняющую JVM. Это похоже на «-javaagent = ... aspectjweaver.jar». – ParkCheolu

ответ

2

Вы сделали несколько ошибок:

  • При использовании <concrete-aspect>, бетон должен просто срез точек быть в вашем aop.xml, а не в коде. Возможно, это была копия ошибки &, но в вашем примере это выглядит так, как если бы конкретный pointcut был определен дважды: в коде и в XML.
  • При конкретизации абстрактного аспекта абстрактный аспект должен уже содержать совет, который вы хотите сопоставить с конкретным pointcut. Его нельзя переопределить с помощью XML или с помощью комбинации кода и XML.

Посмотрите на собственном примере, весьма схожи с вашими:

Пример приложения:

package de.scrum_master.app; 

public class Application { 
    public static void main(String[] args) { 
     Application app = new Application(); 
     app.say("Hello world!"); 
     app.add(11, 22); 
    } 

    private int add(int i, int j) { return i + j; } 
    public void say(String message) { System.out.println(message); } 
} 

Как вы можете видеть, есть две общие методы (один статический, один не- статический) и частный метод. Я сделал это так, чтобы проверить, действительно ли конкретный pointcut действительно поймает публичные.

Абстрактный аспект:

package de.scrum_master.aspectj; 

public abstract aspect AbstractAspect { 
    protected abstract pointcut publicMethod(); 

    Object around() : publicMethod() { 
     System.out.println(thisJoinPointStaticPart); 
     return proceed(); 
    } 
} 

aop.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<aspectj> 
    <aspects> 
     <concrete-aspect 
      name="de.scrum_master.aspectj.ConcreteAspect" 
      extends="de.scrum_master.aspectj.AbstractAspect" 
     > 
      <pointcut 
       name="publicMethod" 
       expression="execution(public * de.scrum_master..*(..))" 
      /> 
     </concrete-aspect> 
    </aspects> 
</aspectj> 

выход Применение при использовании LTW:

execution(void de.scrum_master.app.Application.main(String[])) 
execution(void de.scrum_master.app.Application.say(String)) 
Hello world! 
+0

Я пробовал это. его не работает. Нужно ли мне делать какую-либо конфигурацию (или) путь build (или) любой другой установки? – MAA

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