2

我的商务舱如下:

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>

它终于起作用了

4

1 回答 1

0

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

更多内容: 如何使用 AOP 拦截参数上的超级方法调用?

于 2015-10-25T05:40:46.750 回答