当使用spring aop加载时编织处理方法调用内部问题

时间:2015-10-25 05:15:51

标签: spring aspectj spring-aop load-time-weaving

我的商务课程如下:

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” 我按照

的方式编写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 个答案:

答案 0 :(得分:0)

尝试使用动态代理,它应该可行。这并不容易,但我认为这就是你所需要的。

更多相关信息: How to use AOP to intercept a method call in super on an argument?