我的商务舱如下:
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");
}
}
在春季配置完所有这些bean之后,我打开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 包下有“A 类”,在 com.aspect 包下有“
类 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>
它终于起作用了