一、自定义注解
注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。它相当于一个标记,这个标记我们也可以自己定义,也就有了自定义注解。在这里就不对注解进行详解了。
自定义注解可作用在有类、接口、方法、属性、参数等,它由定义注解接口上的@Taeget配置决定
@Target({ElementType.METHOD,ElementType.PARAMETER,ElementType.FIELD, ElementType.TYPE})
二、拦截器
拦截器我们只需实现HandlerInterceptor接口并重写它的方法,然后实现WebMvcConfigurer注册拦截器
如下:
@Component
public class AyanInterceptor implements HandlerInterceptor {
//该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
//该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
//该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private AyanInterceptor ayanInterceptor;
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
WebMvcConfigurer.super.configurePathMatch(configurer);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration interceptor = registry.addInterceptor(ayanInterceptor);
interceptor.addPathPatterns("/**"); //拦截所有路径
interceptor.excludePathPatterns("/login");//排除拦截/login路径
}
}
三、拦截器中获取注解信息
首先在拦截器里面我们需要把hander的类型转为HandlerMethod
//方法处理器, 请求的目标方法
HandlerMethod handlerMethod = (HandlerMethod) handler;
这里会容易出现一个错误,就是转换失败的问题!!!!!

这个原因一般是年轻人大意导错包了,笔者当时也大意了然后搞了很久才看出来~难搞哦,正确的包是web.method.HandlerMethod

所以建议这里面判断一下是否为HandlerMethod类型,避免程序报错
if (handler instanceof HandlerMethod) { //判断handler是否为HandlerMethod的实例来避免类型转换错误
//方法处理器, 请求的目标方法
HandlerMethod handlerMethod = (HandlerMethod) handler;
}
铁汁们重点来了哦,都多余了噢~
下面就是如何获取注解的信息了,在这里主要展示我们常用在类、方法、参数上的自定义注解:
作用在类:
我们可以通过 handler 参数获取当前拦截的方法,并进一步获取方法所在的类。然后,我们可以使用反射机制获取类上的注解信息,
判断是否存在我们需要的自定义注解,并进一步获取注解的属性值。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 获取拦截的方法
Method method = handlerMethod.getMethod();
// 获取方法所在的类
Class<?> clazz = method.getDeclaringClass();
// 获取类上的注解
Annotation[] annotations = clazz.getAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof AyanAnnotation) {
AyanAnnotation ayan = (AyanAnnotation) annotation;
// 获取注解的属性值
String value =ayan.value();
System.out.println("类上的自定义注解信息: " + value);
}
}
}
return true;
}
作用在方法:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 获取方法上的注解
AyanAnnotation ayan = handlerMethod.getMethodAnnotation(AyanAnnotation.class);//获取目标方法上的指定注解
if (ayan!= null){
// 获取注解的属性值
String value = ayan.value();
System.out.println("方法上的自定义注解信息: " + value);
}
}
return true;
}
作用在参数:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
MethodParameter[] methodAnnotations = handlerMethod.getMethodParameters(); //获取方法参数
for (MethodParameter methodParameter : methodAnnotations) {
AyanAnnotation ayan = methodParameter.getParameterAnnotation(AyanAnnotation.class); //获取指定参数注解
if (ayan!= null){
String value = ayan.value();
System.out.println("方法上的自定义注解信息: " + value);
}
}
}
return true;
}
好了以上就是本文的全部内容,这些是在笔者学习工作过程中的一点点总结,希望能对有需要的铁汁提供学习和帮助
笔者ayan也是第一次写这种文章,还有很多不足,但会不断努力滴,多多关注噢铁汁们 都多余了噢,爱谁谁~