Проблемы при использовании весенне-загрузочного ткачества при вызове методов внутри себя
У меня есть бизнес класс следующим образом:
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 по аргументу?