基于Spring 拦截器实现自定义注解解析器

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  本文以我在项目中需要的自动更新缓存的注解为例,介绍如何编写自定义注解,已经如何依靠拦截器实现注解的解析。注解的的详细介绍其他博文有很多优秀的介绍,不在本文介绍之内。

    首先要实现自定义注解需要创建自己的自定义注解,我的代码如下:

@Retention(RetentionPolicy.RUNTIME)//设置是运行时注解
@Target({ElementType.METHOD})//设置注解类型是方法类型注解
public @interface UpdateCache {
	public String cacheKey() default "abilityMap";
}

    创建自定义注解后,接下来需要创建拦截器解析自定义注解,使自定义注解发挥作用。首先在spring的配置文件配置拦截器。配置如下:


	
		
			
			
			
			
		
		
	

    接下来创建拦截器,代码如下:

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()方法是说请求完成后,拦截器再执行的操作。

    这样,一个自定义注解就发挥作用了。

转载于:https://my.oschina.net/luozhou/blog/879088

你可能感兴趣的:(java,测试,python)