这与春天无关。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 一起使用以及哪些类型需要静态编译的信息。据我所知,没有任何在线资源可以与之相媲美。
| 归档时间: |
|
| 查看次数: |
3061 次 |
| 最近记录: |