java
spring mvc
首先使用idea打开spring的源码HandlerMethodArgumentResolver接口,然后在菜单中选择Navigate》Type Hierarchy,或者直接按快捷键F4
则会打开HandlerMethodArgumentResolver类型结构体系界面,可以看到该接口的所有实现类,如图所示可以发现,这些实现类都是不同类型的解析器
HandlerMethodArgumentResolver接口里resolveArgument和supportParameter两个方法,resolveArgument负责解析参数,supportParameter用来验证是否适合解析某种类型的参数,所有实现类都实现了这两个方法
打开InvocableHandlerMethod类,然后定位到getMethodArgumentValues方法,这个方法就解析参数的入口地方
HandlerMethodArgumentResolverComposite类虽然也实现了HandlerMethodArgumentResolver接口,但它实际上不是解析器,而且负责遍历其它所有解析器的类,然后把已经匹配过的解析器和参数方法进行缓存保存
打开其中一个具体解析器类,如RequestResponseBodyMethodProcessor类,supportParameter方法验证参数带有RequestBody的注解条件,resolveArgument是实际的解析参数的地方
通过上面可以看到,每个具体策略类中,都有具体的解析参数的逻辑,同时也封装了该策略类的条件,在时间调用的地方,循环遍历所有的具体策略类,根据特定的条件进入到对应的策略方法中
spring代码里使用到策略模式的地方很多,大家可以自己试着参考和学习下