这是一个有趣的问题,所以我创建了一个小示例应用程序来解决这个问题!(并在事后根据Sinuhe的反馈对其进行了改进。)
我创建了一个DemoController
应该作为方面示例的类:
@Controller
public class DemoController {
public void soSomething(String s, @MyParamAnnotation Double d, Integer i) {
}
public void doSomething(String s, long l, @MyParamAnnotation int i) {
}
public void doSomething(@MyParamAnnotation String s) {
}
public void doSomething(long l) {
}
}
将在前三个方法上添加连接点的方面,但不是参数未注释的最后一个方法@MyParamAnnotation
:
@Aspect
public class ParameterAspect {
@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void beanAnnotatedWithAtController() {
}
@Pointcut("execution(public * *(.., @aspects.MyParamAnnotation (*), ..))")
public void methodWithAnnotationOnAtLeastOneParameter() {
}
@Before("beanAnnotatedWithAtController() "
+ "&& methodWithAnnotationOnAtLeastOneParameter()")
public void beforeMethod() {
System.out.println("At least one of the parameters are "
+ "annotated with @MyParamAnnotation");
}
}
第一个切入点将在标有 的类中的所有方法上创建一个连接点@Controller
。
当满足以下条件时,第二个切入点将添加一个连接点:
- 公共方法
- first
*
是每个返回类型的通配符。
- second
*
是所有类中所有方法的通配符。
(..,
在带注释的参数之前匹配零到多个任何类型的参数。
@aspects.MyParamAnnotation (*),
匹配使用给定注释注释的参数。
..)
在带注释的参数之后匹配零到多个任何类型的参数。
最后,@Before
建议会建议所有方法,其中两个切入点中的所有条件都满足。
切入点适用于 AspectJ 和 Spring AOP!
说到性能。开销很小,尤其是使用在编译时或加载时进行编织的 AspectJ。