网上关于这一点的文章似乎不很多,随手记一笔。
注解的处理
注解可以用在2个阶段:编译期和运行期。
编译期注解可用javac的Annotation Processor 来处理,我们需要定义自己的Annotation Processor 供javac使用,这里面有一定的规范,可参考相关文章解决。
运行期注解在spring下可用@Aspect切面编程来处理,比如我们的注解如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String lockName();
int leaseTime();
}
处理该注解的方法如下:
@Component
@Aspect
@Slf4j
public class CustomAspect {
...
@Around("@annotation(annoInst)")
public Object doAround(ProceedingJoinPoint pjp, MyAnnotation annoInst) throws Throwable {
// 前置处理
...
try {
return pjp.proceed();
} finally {
// 后置处理
...
}
}
}
我们先用@Component+@Aspect定义一个处理注解的spring bean。这里我们要获取注解的参数值,所以doAround函数要加上如下注解:
@Around("@annotation(annoInst)")
表明我们的环绕(around)操作要处理的是一个MyAnnotation类型注解的实例annoInst,annoInst必须声明为doAround函数的一个参数。
如果我们并不需要处理注解参数,可以这样写:
@Component
@Aspect
@Slf4j
public class CustomAspect {
...
@Around("@annotation(MyAnnotation)")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
// 前置处理
...
try {
return pjp.proceed();
} finally {
// 后置处理
...
}
}
}
注意:这里我们仅仅在@annotation里声明了注解的类型,且doAround函数参数里也不带MyAnnotation注解实例。
顺带说一下,@Around除了@annotation,还能支持execution表达式,后者能力非常灵活,可以指定到特定类的特定函数,网上有很多介绍文章,这里就不赘述了。