我的商务课程如下:
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”的方法调用也可以被拦截,但似乎我没有这样做。 有人会帮助我指出问题吗,我错过了什么?
---------------------------- EDIT ------------------ ---------------
经过一些调试后,我发现了我的错误
在现实生活中,
我在包装 com.bussiness 的情况下hava“A级”
包装 com.aspect 下的“class Aspect”
我按照
<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>
终于有效了
答案 0 :(得分:0)
尝试使用动态代理,它应该可行。这并不容易,但我认为这就是你所需要的。
更多相关信息: How to use AOP to intercept a method call in super on an argument?