springMVC源碼解析--HandlerMethodArgumentResolverComposite參數(shù)解析器集合(二)

上一篇博客springMVC源碼分析--HandlerMethodArgumentResolver參數(shù)解析器(一)中我們已經(jīng)介紹了參數(shù)解析相關(guān)的東西,并且也提到了HandlerMethodArgumentResolverComposite,其簡單來說就是所有的參數(shù)解析器的鏈表,保存了springMVC提供的所有的參數(shù)解析器,采用職責(zé)鏈的模式來完成參數(shù)解析器的查找,并完成參數(shù)解析生成目標(biāo)對象。

完整源碼及說明如下:

public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {  
  
    protected final Log logger = LogFactory.getLog(getClass());  
  
    //保存springMVC提供的所有的參數(shù)解析器  
    private final List<HandlerMethodArgumentResolver> argumentResolvers =  
            new LinkedList<HandlerMethodArgumentResolver>();  
  
    //用于緩存已經(jīng)查找過的參數(shù)解析器  
    private final Map<MethodParameter, HandlerMethodArgumentResolver> argumentResolverCache =  
            new ConcurrentHashMap<MethodParameter, HandlerMethodArgumentResolver>(256);  
    //獲取所有的參數(shù)解析器  
    public List<HandlerMethodArgumentResolver> getResolvers() {  
        return Collections.unmodifiableList(this.argumentResolvers);  
    }  
  
    //判斷參數(shù)解析器是否支持參數(shù)解析  
    @Override  
    public boolean supportsParameter(MethodParameter parameter) {  
        return (getArgumentResolver(parameter) != null);  
    }  
  
    //返回參數(shù)解析器解析后的數(shù)據(jù)  
    @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);  
    }  
  
    //獲取支持某個(gè)參數(shù)解析的參數(shù)解析器  
    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;  
    }  
  
    //添加參數(shù)解析器  
    public HandlerMethodArgumentResolverComposite addResolver(HandlerMethodArgumentResolver resolver) {  
        this.argumentResolvers.add(resolver);  
        return this;  
    }  
    //獲取參數(shù)解析器集合  
    public HandlerMethodArgumentResolverComposite addResolvers(List<? extends HandlerMethodArgumentResolver> resolvers) {  
        if (resolvers != null) {  
            for (HandlerMethodArgumentResolver resolver : resolvers) {  
                this.argumentResolvers.add(resolver);  
            }  
        }  
        return this;  
    }  
  
}  
轉(zhuǎn)載于:http://blog.csdn.net/qq924862077/article/details/54291812
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容