首页 文章

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

提问于
浏览
3

所以,当我的域中对象的状态发生变化时,我开始考虑使用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 回答

  • 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代理,则还可以在日志中查看编织过程 .

    我希望它有所帮助!

相关问题