springaspectjmaven编译时编织

use*_*201 1 spring aspectj

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

如果有一个例子或教程那就太好了。

Sea*_*oyd 5

这与春天无关。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");
    }

}
Run Code Online (Sandbox Code Playgroud)

传统 (.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);
    }

}
Run Code Online (Sandbox Code Playgroud)

@AspectJ-style (.java) 方面(几乎等效)

@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);

    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

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

传统: foo 之前:Bar Baz Phleem
@AspectJ: foo 之前:Bar Baz Phleem
bar
@AspectJ: foo 之后:Bar Baz Phleem
传统: foo 之后:Bar Baz Phleem

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

参考:

阅读Ramnivas Laddad 的AspectJ in Action了解更多信息。它还包含有关哪些类型的方面可以与 Spring AOP 一起使用以及哪些类型需要静态编译的信息。据我所知,没有任何在线资源可以与之相媲美。