微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

springMVC源码解析--HandlerMethodArgumentResolverComposite参数解析器集合二

上1篇博客springMVC源码分析--HandlerMethodArgumentResolver参数解析器(1)中我们已介绍了参数解析相干的东西,并且也提到了HandlerMethodArgumentResolverComposite,其简单来讲就是所有的参数解析器的链表,保存了springMVC提供的所有的参数解析器,采取职责链的模式来完成参数解析器的查找,并完成参数解析生成目标对象。

完全源码及说明以下:

public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {

	protected final Log logger = LogFactory.getLog(getClass());

	//保存springMVC提供的所有的参数解析器
	private final List<HandlerMethodArgumentResolver> argumentResolvers =
			new LinkedList<HandlerMethodArgumentResolver>();

	//用于缓存已查找过的参数解析器
	private final Map<MethodParameter,HandlerMethodArgumentResolver> argumentResolverCache =
			new ConcurrentHashMap<MethodParameter,HandlerMethodArgumentResolver>(256);
	//获得所有的参数解析器
	public List<HandlerMethodArgumentResolver> getResolvers() {
		return Collections.unmodifiableList(this.argumentResolvers);
	}

	//判断参数解析器是不是支持参数解析
	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		return (getArgumentResolver(parameter) != null);
	}

	//返回参数解析器解析后的数据
	@Override
	public Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer,NativeWebRequest webRequest,WebDataBinderFactory binderFactory) throws Exception {

		HandlerMethodArgumentResolver resolver = getArgumentResolver(parameter);
		if (resolver == null) {
			throw new IllegalArgumentException(UnkNown parameter type [ + parameter.getParameterType().getName() + ]);
		}
		return resolver.resolveArgument(parameter,mavContainer,webRequest,binderFactory);
	}

	//获得支持某个参数解析的参数解析器
	private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
		HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);
		if (result == null) {
			for (HandlerMethodArgumentResolver methodArgumentResolver : this.argumentResolvers) {
				if (logger.isTraceEnabled()) {
					logger.trace(Testing if argument resolver [ + methodArgumentResolver + ] supports [ +
							parameter.getGenericParameterType() + ]);
				}
				if (methodArgumentResolver.supportsParameter(parameter)) {
					result = methodArgumentResolver;
					this.argumentResolverCache.put(parameter,result);
					break;
				}
			}
		}
		return result;
	}

	//添加参数解析器
	public HandlerMethodArgumentResolverComposite addResolver(HandlerMethodArgumentResolver resolver) {
		this.argumentResolvers.add(resolver);
		return this;
	}
	//获得参数解析器集合
	public HandlerMethodArgumentResolverComposite addResolvers(List<? extends HandlerMethodArgumentResolver> resolvers) {
		if (resolvers != null) {
			for (HandlerMethodArgumentResolver resolver : resolvers) {
				this.argumentResolvers.add(resolver);
			}
		}
		return this;
	}

}


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐