使用AspectJ的新手:无法调用方面

时间:2010-11-18 15:33:36

标签: java aspectj

所以,当我的域中对象的状态发生变化时,我开始考虑使用AspectJ来处理处理事件。

实际上,我想写一些包含我域中所有setter方法的建议。调用通知时,它将检查所设置字段的初始值,运行setter,然后在setter执行后检查该值。如果值发生更改,它将向事件侦听器触发事件​​,通知更改。

我使用了这里的教程:http://www.andrewewhite.net/wordpress/2010/03/17/aspectj-annotation-tutorial/,但是我无法接到任何建议。请注意,我只是使用LTW方法编织我的建议,我不是使用AspectJ语言编写建议并预编译它。

我的aop.xml(在我的测试套件的META-INF中)看起来像这样:

<aspectj>
    <aspects>
        <aspect name="domain.aop.TestAspect"/>
    </aspects>
</aspectj>

我创建的Aspect类看起来像这样:

package domain.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class TestAspect
{
    @Around("call(* domain.*.set*(..))")
    public void aroundSetMethods (JoinPoint jp)
    {
        System.out.println ("aroundSetMethod called");
    }
}

当我运行我的测试用例时,我可以看到(通过设置断点)调用方法(domain.Error.setTask())。我相信这应该引发我的建议,但我从未接受过建议方法。

指出我在这里做错了什么?

由于

1 个答案:

答案 0 :(得分:3)

您还必须包含要编织的类。

尝试用以下内容替换aop.xml文件:

<!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <!-- only weave classes in this package -->
        <include within="domain.*" />
    </weaver>
    <aspects>
        <!-- use only this aspect for weaving -->
        <aspect name="domain.aop.TestAspect"/>
    </aspects>
</aspectj>

如果您已正确配置运行时服务器或Java代理,您还可以在日志中看到编织过程。

我希望它有所帮助!