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

3497次上1篇博客springMVC源码分析--HandlerMethodArgumentResolver参数解析器(1)中我们已介绍了参数解析相干的东西,并且也提到了HandlerMethodArgumentResolverCompos。

3497次

上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;
	}

}

综上所述,以上就是关于springMVC源码解析--HandlerMethodArgumentResolverComposite参数解析器集合(二)的全部内容了,字数约2841字,希望能够解决你的困惑。屹东网往后会继续推荐springMVC源码解析--HandlerMethodArgumentResolverComposite参数解析器集合(二)相关内容。