Spring Mvc的一个强大之处在于对于各种参数注入的支持。
除了基本的request,session等等以外,还支持RequestParam等等便利的东西。基本而言使用Spring mvc你可以直接在方法中指明你希望获得的参数,让Spring注入即可。
参数注入的原理
Spring Mvc中有一个HandlerMethodArgumentResolver接口,其中包含两个方法:
publicbooleansupportsParameter(MethodParameter parameter)
publicObject (MethodParameter parameter,ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory)throws Exception
当请求被Spring Mvc处理并获取到对应的执行方法时,它会首先检查所需的所有参数,然后依次检查现有的HandlerMethodArgumentResolver等否支持此类型,如果可以再调用resolveArgument方法获取参数对象。
Spring Mvc自身有RequestParamMethodArgumentResolver,RequestParamMapMethodArgumentResolver等等常用的参数解析器。
在RequestMappingHandlerAdapter中的getDefaultArgumentResolvers方法中硬编码了它们,而且顺序是固定无法改变的。
Cookie的注入
只要实现了HandlerMethodArgumentResolver就可以实现参数注入,以Spring Mvc自带的ServletCookieValueMethodArgumentResolver。
因为从request从取出cookie值本身是一件相对简单的事情,所以这个类是一个很好的学习的例子。
@Overrideprotected ObjectresolveName(String cookieName, MethodParameter parameter, NativeWebRequest webRequest)throws Exception {
HttpServletRequest servletRequest =