spring怎么在controller层使用自定义的注解

前言

我们在controller层经常使用@RequestMapping注解控制器方法,那么我们在实际开发中是否可以使用自定义的注解简化开发流程呢?要解决这个问题首先需要了解spring mvc的实现原理,具体可以参考博主的这篇博客Spring源码分析——SpringMVC实现

简单的说,一个Http请求会被mvc框架包装成一个HandlerExecutionChain对象,而这个对象中包含了一系列的过滤器(interceptor)和控制器(handler)。我们所要做的就是获取到这个handler,然后获取到handler上自定义的注解信息,然后通过注解处理器处理这些信息进行相应的处理,这个过程可以放在spring-mvc的过滤器中来做,当然也可以根据业务的实际情况放在任何可以获取HandlerExecutionChain对象的地方来做(实际上获取HandlerExecutionChain对象需要HttpServeletRequest)。

式例代码

一个自定义注解

package com.netease.edu.web.annotation;


@java.lang.annotation.Target({ java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE })
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Inherited
@java.lang.annotation.Documented
public @interface NeedLogin {

    String value() default "";
}

controller方法

@NeedLogin
@RequestMapping(value = {"/***"})
public ResponseView ***(){
   ...
}

获取自定义注解

public static int getNeedLoginType(HttpServletRequest request) {
        HandlerExecutionChain handlerChain = null;
        try {
            K12DispatcherServlet servlet = getEduDispatcherServlet();
            if (servlet == null) {

                return NEED_LOGIN;

            }
            handlerChain = servlet.getHandler(request);
            if (handlerChain == null || handlerChain.getHandler() == null) {
                return NO_HANDLER;
            }
            int needLoginType = NO_NEED_LOGIN;
            HandlerMethod handerMethod;
            if (!(handlerChain.getHandler() instanceof ResourceHttpRequestHandler)) {
                handerMethod =  (HandlerMethod) handlerChain.getHandler();
                if (handerMethod.getMethodAnnotation(NeedLogin.class) != null) {
                    needLoginType = NEED_LOGIN;
                }
            }
            return needLoginType;

        } catch (Exception e) {
            log.error("error fo getHandler", e);
            return NO_HANDLER;
        }
    }

既然能够获取到注解信息,后面通过自定义的注解处理器就可以为所欲为啦,读到这篇博客的小伙伴如果有时间可以去看一下RequestMapping注解的实现原理是怎么样的。

你可能感兴趣的:(spring)