在项目里面想使用自定义annotation,就是参数列表,类似于spring mvc里面的 @PathVariable("id") 注解。然后再使用AOP来解释这个注解。
1) 开始添加springboot aop依赖,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
开启使用aspect
@EnableAspectJAutoProxy
2) 声明注解,
第一个声明的注解作用在方法上,只有这个方法的才会去扫描。
@Inherited
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {
String name();
int rate();
int period();
TimeUnit periodUnit() default TimeUnit.SECONDS;
}
第二个注解声明在参数上,只有这个方法的参数上才可以生效。
@Inherited
@Documented
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimitKey {
String value();
}
3) 注解方法
@Around(value = "@annotation(RateLimiter)")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long time = System.currentTimeMillis();
//得到方法的信息
MethodSignature methodSignature = (MethodSignature)pjp.getSignature();
//获得方法注解的信息
RateLimiter configruation = methodSignature.getMethod().getAnnotation(RateLimiter.class);
System.out.println(configruation.confBeanName());
Object retVal = pjp.proceed();
time = System.currentTimeMillis() - time;
System.out.println("process time: " + time + " ms");
return retVal;
}
//获得在参数上面的注解信息
private Object getAnnotateObject(Object[] objects, Method method){
Parameter[] parameters = method.getParameters();
for (Parameter parameter : parameters){
if (parameter.isAnnotationPresent(RateLimitKey.class)){
RateLimitKeykey = parameter.getAnnotation(RateLimitKey.class);
System.out.println(key.value());
}
}
return null;
}