代码之家  ›  专栏  ›  技术社区  ›  Steve

使用AspectJ的新手:无法调用aspect

  •  3
  • Steve  · 技术社区  · 15 年前

    因此,我已经开始研究如何使用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 回复  |  直到 15 年前
        1
  •  3
  •   Espen    15 年前

    你还必须包括你想编织的类。

    尝试将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代理,您还可以在日志中看到编织过程。

    希望有帮助!