SpringBoot自定義註解讓基礎框架更爲簡單

此文主要代表兩點:java

①熟悉SpringBoot的RequestMappingHandlerAdapter  。git

②自定義實現參數驗證以及參數封裝 從新自定義本身的@ResponBody註解,自定義註解的寫法。web

工欲善其事必先利其器,一個好的架構可以讓代碼寫起來更爲簡潔,讓程序實現起來更加方便。spring

註釋:網上的文章不少,能夠本身去搜索,這裏就不作詳細的解釋。架構

   註解的 基本機制有點相似於java的反射,概念性的東西請自行百度,這裏只講怎麼去實現。app

實現@MyRequestBody,和@MyResponBody框架

//也許有人會問 爲何不直接改寫@RespnBody, 我以爲 這應該是沒是找事幹的感受,除了能強行裝逼以外毫無心義,你不知道你改寫後之後會出現什麼問題。ide

代碼:spa

/**
 * Created by reasahi on 2017/6/16.
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyRequestBody {
}        

//MyResponBody.net

/**
 * Created by reasahi on 2017/6/16.
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyResponseBody {
}

//如何自定義,怎樣讓Spring 認識他,怎麼加入代碼塊

SpringBoot 以spring爲起點而產生的框架,貫穿於Spring的DispatcherServlet     做爲web的請求處理類,既然咱們選擇要從新定義本身的 請求和返還類 那麼 有必要了解一下DispatcherServlet,在好久以前的SSH 框架中 Action 交給struts2 進行處理請求和返還統一管理 。而Spring的DispatcherServlet則是接收WebApplicationContext和ServletConfig進行必要參數的初始化,service方法,是處理請求的入口,接受request和response參數

既然知道了這點那麼想要實現本身的參數解析,參數返還那麼就簡單多了。

RequestMappingHandlerAdapter是其中一個典型的例子,這個類包含HandlerMethodArgumentResolverHandlerMethodReturnValueHandler的一些實現類來處理RequestMapping的參數和返回值。

private HandlerMethodArgumentResolverComposite argumentResolvers;
    private HandlerMethodReturnValueHandlerComposite returnValueHandlers;

RequestResponseBodyMethodProcessorHandlerAdapter的內部一個重要的類,這個類同時實現了HandlerMethodArgumentResolverHandlerMethodReturnValueHandler
其中HandlerMethodArgumentResolver接口有兩個方法。

public interface HandlerMethodArgumentResolver {
    boolean supportsParameter(MethodParameter parameter);
    Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;
}

HandlerMethodReturnValueHandler接口一樣也有兩個方法。

public interface HandlerMethodReturnValueHandler {
    boolean supportsReturnType(MethodParameter returnType);
    void handleReturnValue(Object returnValue, MethodParameter returnType,
            ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;
}

因此從RequestResponseBodyMethodProcessor實現的方法,就能夠看出來這個類,會處理被@RequestBody註解的參數,和@ResponseBody註解的返回值。

@Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(RequestBody.class);
    }
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return (AnnotationUtils.findAnnotation(returnType.getContainingClass(), ResponseBody.class) != null ||
                returnType.getMethodAnnotation(ResponseBody.class) != null);
    }

接下來就介紹一下自定義ResponseBody和RequestBody的使用方法。

配置一個Bean

/**
 * Created by reasahi on 2017/6/16.
 */
@Configuration
public  class MyWebMvcConfigurationSupport extends WebMvcConfigurationSupport {
    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
        RequestMappingHandlerAdapter requestMappingHandlerAdapter = super.requestMappingHandlerAdapter();
        List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
        converters.add(new DataMessageConvert());
        List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<HandlerMethodArgumentResolver>();
        argumentResolvers.add(new MyResolver(converters));
        requestMappingHandlerAdapter.setCustomArgumentResolvers(argumentResolvers);
        List<HandlerMethodReturnValueHandler> returnValueHandlers = new ArrayList<HandlerMethodReturnValueHandler>();
        returnValueHandlers.add(new MyResolver(converters));
        requestMappingHandlerAdapter.setCustomReturnValueHandlers(returnValueHandlers);
        return requestMappingHandlerAdapter;
    }
}

剩下的就是去實現中間咱們定義的 MyResolver(converters);

我這裏寫了一個demo 實現 參數驗證,數據返還過多的看代碼,文章輔助理解;

 

 

git 地址http://git.oschina.net/reasahi/springBootInterface

下一篇寫 統一配置

相關文章
相關標籤/搜索