Spring Mvc的参数注入分析

30 10月

Spring Mvc的一个强大之处在于对于各种参数注入的支持。

除了基本的request,session等等以外,还支持RequestParam等等便利的东西。基本而言使用Spring mvc你可以直接在方法中指明你希望获得的参数,让Spring注入即可。

参数注入的原理

Spring Mvc中有一个HandlerMethodArgumentResolver接口,其中包含两个方法:


当请求被Spring Mvc处理并获取到对应的执行方法时,它会首先检查所需的所有参数,然后依次检查现有的HandlerMethodArgumentResolver等否支持此类型,如果可以再调用resolveArgument方法获取参数对象。

Spring Mvc自身有RequestParamMethodArgumentResolver,RequestParamMapMethodArgumentResolver等等常用的参数解析器。

在RequestMappingHandlerAdapter中的getDefaultArgumentResolvers方法中硬编码了它们,而且顺序是固定无法改变的。

Cookie的注入

只要实现了HandlerMethodArgumentResolver就可以实现参数注入,以Spring Mvc自带的ServletCookieValueMethodArgumentResolver。

因为从request从取出cookie值本身是一件相对简单的事情,所以这个类是一个很好的学习的例子。


`

直接获取到webRequest,从中取出所需的值即可。

自定义参数注入器

Spring Mvc提供了很多常见的支持,但是有时候有一些特殊的需求,需要我们自己定义。

首先创建一个对应的实现,实现supportsParameterresolveArgument

然后将这个类配置起来


这里有个问题需要注意,那就是RequestMappingHandlerAdapter中已有的参数注入器的顺序是硬编码的,而自定义的部分在最后,所以要注意自定义的注入器不会和被Spring Mvc自带的部分解析掉。


参考资料

Spring 3.1+ argument resolver cannot handle proprietary Person class argument

2 Replies to “Spring Mvc的参数注入分析

    • 默认情况下Spring自带的参数注入器的优先级高于自定义的,理想情况下不应该让自定义的注入器和Spring自带的有冲突。
      简单办法是自定义一个新的类,这样就只有自定义的注入器能够支持。

      还有一种方法就是替换掉注入器的列表,将Spring自带的优先级降低。

发表评论

电子邮件地址不会被公开。