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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值