说我有这样的方法:
public void method(@CustomAnnotation("value") String argument)
是否有切入点表达式可以选择带有@CustomAnnotation注释参数的所有方法?如果是这样,我可以通过“价值”参数获取访问权限吗?
答案 0 :(得分:16)
选择你的论点:
@Before("execution(* *(@CustomAnnotation (*)))")
public void advice() {
System.out.println("hello");
}
参考:http://forum.springsource.org/archive/index.php/t-61308.html
获取注释参数:
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Annotation[][] methodAnnotations = method.getParameterAnnotations();
将为您提供可以迭代的注释,并使用instanceof查找绑定注释。我知道那是hacky但是afaik这是目前支持的唯一方式。
答案 1 :(得分:3)
只需完成最后一个答案:
@CustomAnnotation
将匹配一个方法,其中方法的参数之一(其中之一)用 service.doJob(@CustomAnnotation Pojo arg0, String arg1);
进行注释,例如:
@Before(value="execution(* *(@CustomAnnotation *, ..)) && args(input, ..)")
public void inspect(JoinPoint jp, Object input) {
LOGGER.info(">>> inspecting "+input+" on "+jp.getTarget()+", "+jp.getSignature());
}
与
相反@CustomAnnotation
将与其中参数其中一个带有注释 service.doJob(AnnotatedPojo arg0, String arg1);
的方法匹配,例如:
@CustomAnnotation
public class AnnotatedPojo {
}
其中的pojo声明如下:
@CustomAnnotation (*)
所有区别都在于切入点声明中的@CustomAnnotation *
与const a = 1;
const b = 2;
const c = 'hello'
function myfunction({a,b,c}){
console.log(c)
}
myfunction({c})
function wrapper({params}){}
。
答案 2 :(得分:2)
要匹配 1..N 个带注释的参数无论其位置如何使用
@Before("execution(* *(@CustomAnnotation (*), ..)) || " +
"execution(* *(.., @CustomAnnotation (*), ..)) || " +
"execution(* *(.., @CustomAnnotation (*)))")
public void advice(int arg1, @CustomAnnotation("val") Object arg2) { ... }
答案 3 :(得分:1)
如果你在方法中有多个参数,你应该使用两个点来表示任意数量的参数(零或更多)
@Before("execution(* *(@CustomAnnotation (*), ..))")
public void advice() {
System.out.println("hello");
}
答案 4 :(得分:0)
来自Spring Docs:
@Before("@annotation(myAnnotation)")
public void audit(Auditable myAnnotation) {
AuditCode code = auditable.value();
// ...
}
对我来说效果很好,无需操纵方法签名。
注意:如果您使用的是命名切入点,因为切入点名称可能会重载,您必须提供匹配(参数名称和顺序)签名。
@Before("goodAdvise(myAnnotation)")
public void audit(Auditable myAnnotation) {
String value = auditable.value();
// ...
}
@Pointcut("@annotation(myAnnotation)")
public void goodAdvise(Auditable myAnnotation) {
//empty
}