Проблемы при использовании весенне-загрузочного ткачества при вызове методов внутри себя

У меня есть бизнес класс следующим образом:

class A {
    public void sayHello(String name){
        System.out.println("hello "+name);
    }
    public void openDoorForJack(){
        System.out.println("door opened");
        this.sayHello("Jack");
    }
}

и класс аспектов следующим образом:

@Aspect
class Aspect {
    @Pointcut("execution (* com..*.sayHello(String)) && args(name)")
    public void beforeSayHelloPointCut(String name) {}
    @Before("beforeSayHelloPointCut(name)")
    public void beforeSayHello(String name) throws Throwable {
        System.out.println(name+" is knocking");
    }
}

после того, как все эти компоненты настроены весной, я включаю LTW с помощью

<aop:aspectj-autoproxy/>
<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>

Конечно,aspectjrt,aspectj-weaver, spring-instrument находятся в положении,-javaagent:path/spring-instrument.jar передается в опции VM, а затем aop.xml находится в META-INF.

<!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <!-- only weave classes in specific packages -->
        <include within="*"/>
    </weaver>

    <aspects>
        <!-- weave in just this aspect -->
        <aspect name="com.Aspect"/>
    </aspects>
</aspectj>

Когда я запускаю тест, как:

applicationContext.getBean(A.class).sayHello("Jack");

результат кажется идеальным

Jack is knocking
Hello Jack

Но когда я запускаю тест, который вызывает sayHello внутри себя

applicationContext.getBean(A.class).openDoorForJack();

никакого перехвата не происходит вообще

door opened
Hello Jack

Причина, по которой я использую LTW, заключается в том, что я хочу, чтобы вызов методов, использующих "this" или "super", также мог быть перехвачен, но, похоже, я не смог этого сделать. Может ли кто-нибудь помочь мне указать на проблему, я что-то пропустил?

----------------------------РЕДАКТИРОВАТЬ--------------------- ------------
После некоторой отладки я нашел, где я ошибся
В реальной жизни,
У меня хава "класс А" под пакет com.bussiness
и "класс Аспект" под пакетом com.aspect
Я работаю над aop.xml

<weaver>
      <!-- only weave classes in specific packages -->
      <include within="com.aspect.*"/>
</weaver>

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

<weaver>
      <!-- com package and its sub package all get woven-->
      <include within="com..*"/>
</weaver>

Это наконец работает

1 ответ

Попробуйте динамический прокси, он должен работать. Это не легко, но я думаю, что это то, что вам нужно.

Подробнее об этом: Как использовать AOP для перехвата вызова метода super по аргументу?

Другие вопросы по тегам