本文以我在项目中需要的自动更新缓存的注解为例,介绍如何编写自定义注解,已经如何依靠拦截器实现注解的解析。注解的的详细介绍其他博文有很多优秀的介绍,不在本文介绍之内。
首先要实现自定义注解需要创建自己的自定义注解,我的代码如下:
@Retention(RetentionPolicy.RUNTIME)//设置是运行时注解
@Target({ElementType.METHOD})//设置注解类型是方法类型注解
public @interface UpdateCache {
public String cacheKey() default "abilityMap";
}
创建自定义注解后,接下来需要创建拦截器解析自定义注解,使自定义注解发挥作用。首先在spring的配置文件配置拦截器。配置如下:
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/**" />
<!-- 拦截器类 -->
<bean class="cn.com.component.common.interceptor.AnnotationParser"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
接下来创建拦截器,代码如下:
public class AnnotationParser extends HandlerInterceptorAdapter {
private transient final static Log log = LogFactory.getLog(AnnotationParser.class);
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method=handlerMethod.getMethod();//获取请求的方法
//判断方法名上是否有指定类名的自定义注解
boolean isAnnotationPresent=method.isAnnotationPresent(UpdateCache.class);
if(isAnnotationPresent){
UpdateCache cache=method.getAnnotation(UpdateCache.class);
log.info("准备执行更新缓存操作,缓存key:"+cache.cacheKey());
AbilityUtil.refresh();
log.info("缓存刷新完毕");
}
}
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
super.afterConcurrentHandlingStarted(request, response, handler);
}
}
由于我的需求是在add方法和update方法执行完成之后刷新缓存,所以只需要在afterCompletion()方法写解析代码,afterCompletion()方法是说请求完成后,拦截器再执行的操作。
这样,一个自定义注解就发挥作用了。