事情是这样子的:
我想自定义一个缓存注解,用来缓存方法返回值,并且支持自定义缓存超时时间,注解定义是这样:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface MyCache {
@AliasFor("value")
int expireTime() default 60;
@AliasFor("expireTime")
int value() default 60;
}
本来只想写一个expireTime,但想着大家肯定能偷懒尽量偷懒嘛,那最好还是支持 @MyCache(50)
这种写法、省去一步。于是也有了上面的写法,使用spring提供的@AliasFor
,显式的定义两个属性互为别名,目的就是如果不在注解中指定属性,则默认就是将值给到超时时间expireTime。
这样写也是看了spring里@Transactional
注解的定义,按道理,应该是我配置了 @MyCache(50)
后,我在Advice代码中取这个注解的expireTime
属性值时,应该是拿到value
的值,即50,但实际效果却不是这样,expireTime
的值仍为默认的60。
而我取值的代码如下:
@Around("myCache()")
public Object around(ProceedingJoinPoint pjp) {
......
//获取方法对象
Method curMethod = getMethodByJoinPoint(pjp, methodSignature);
//出问题的是这一句!
Annotation annotation = curMethod.getAnnotation(MyCache.class);
Integer expireTime = (Integer) getAnnotationConfig(annotation, "expireTime");
Integer ann