spring aspectj maven编译时间编织

时间:2011-01-24 16:47:02

标签: spring aspectj

是否可以使用带有aspectj的spring来进行编译时编织而不是写出aspectj的.aj文件

如果有一个例子或教程会很棒。

2 个答案:

答案 0 :(得分:4)

这与Spring无关。 AspectJ支持传统语法(.aj文件)和所谓的@AspectJ - 语法(带注释的.java文件)。

Spring AOP仅支持后者,但AspectJ编译器同时支持。

实施例

Java类:

public class ServiceClass{

    public void foo(final String bar){
        System.out.println(bar);
    }

    public static void main(final String[] args){
        new ServiceClass().foo("Bar Baz Phleem");
    }

}

传统(.aj)方面:

public aspect TestTraditionalAspect{

    pointcut executeFoo(String bar) : execution(* foo.bar.ServiceClass.foo(**))
    && args(bar)
    ;

    void around(final String args) : executeFoo(args) {
        System.out.println("Traditional: Before foo: "+args);
        proceed(args);
        System.out.println("Traditional: After foo: "+args);
    }

}

@ AspectJ-style(.java)Aspect(几乎相当)

@Aspect
public class TestAtAspectJAspect{

    @Pointcut(value = "execution(* foo.bar.ServiceClass.foo(**))"
                    + " && args(bar)")
    public void executeFoo(final String bar){
    }

    @Around("executeFoo(args)")
    public void aroundFooExecution(final String args,
        final ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("@AspectJ: Before foo: " + args);
        pjp.proceed(new String[] { args });
        System.out.println("@AspectJ: After foo: " + args);

    }

}

<强>输出:

这是我在Eclipse中运行ServiceClass.main()作为Java / AspectJ应用程序时的输出:

  

传统:在foo之前:Bar Baz Phleem
  @AspectJ:在foo之前:Bar Baz Phleem
  酒吧
  @AspectJ:foo之后:Bar Baz Phleem
  传统:在foo之后:Bar Baz Phleem

Eclipse内部使用AspectJ编译器,因此如果使用Maven在源代码上运行AspectJ编译器,也会发生同样的事情。

参考:

阅读Ramnivas Laddad的AspectJ in Action了解更多信息。它还包含有关Spring AOP可以使用哪些方面的信息以及需要静态编译的类型。我知道没有在线资源甚至可以接近。

答案 1 :(得分:1)

看看springsource.org/roo/start。 Spring的新产品,用于快速应用程序开发。您启动一个roo控制台并键入您的域对象名称和属性,并且roo创建pojo,这些pojo在编译时使用aspectj类进行了增强。 Roo还创造了一个maven pom,最后你得到了你所要求的。我找到了roo perfekt来获得如何使用spring和aspectj和maven以及更多内容的教程。