此文主要代表兩點: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是其中一個典型的例子,這個類包含HandlerMethodArgumentResolver,HandlerMethodReturnValueHandler的一些實現類來處理RequestMapping的參數和返回值。
private HandlerMethodArgumentResolverComposite argumentResolvers; private HandlerMethodReturnValueHandlerComposite returnValueHandlers;
RequestResponseBodyMethodProcessor是HandlerAdapter的內部一個重要的類,這個類同時實現了HandlerMethodArgumentResolver,HandlerMethodReturnValueHandler。
其中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
下一篇寫 統一配置