是否可以使用带有aspectj的spring来进行编译时编织而不是写出aspectj的.aj文件
如果有一个例子或教程会很棒。
答案 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以及更多内容的教程。