公众号,欢迎关注
HandlerMethodArgumentResolver
是一个策略接口,用来将方法的参数解析为参数的值,HandlerMethodArgumentResolver
有很多的实现类,比如
RequestParamMethodArgumentResolver
RequestHeaderMethodArgumentResolver
PathVariableMethodArgumentResolver
MatrixVariableMethodArgumentResolver
- … 还有很多,可以通过查看源代码查看
还有一个很特殊的实现 HandlerMethodArgumentResolverComposite
,HandlerMethodArgumentResolverComposite
实现了 HandlerMethodArgumentResolver
接口,但却没有实现具体的参数解析策略,而是将所有的具体策略都组合到了 HandlerMethodArgumentResolverComposite
中
HandlerMethodArgumentResolverComposite
是一个典型的组合模式
的实现,从类的名称也能看出一二
这样实现有什么好处呢?
组合模式有三个好处
- 去除重复代码
- 统一客户端的代码调用
- 支持对象树的处理(《重构到模式》 7.5 节有一个完美的例子)
在我看来,这里组要是体现了第二个好处,就是统一客户端的代码调用,客户只要通过与 HandlerMethodArgumentResolverComposite
进行交互即可,不需要了解具体的策略类型,对策略的选择交给 HandlerMethodArgumentResolverComposite
类进行处理
HandlerMethodArgumentResolverComposite
将客户端与具体的策略实现进行了隔离,通过 HandlerMethodArgumentResolverComposite
可以对具体的策略进行扩展而客户端无感知,也是开闭原则(OCP)的一个体现
从源码中也可以看到,几乎所有使用 HandlerMethodArgumentResolver
的地方都是实例化的 HandlerMeth