SPRING自定义注入CONTROLLER变量
生活随笔
收集整理的這篇文章主要介紹了
SPRING自定义注入CONTROLLER变量
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
問題描述
在SpringMVC中默認(rèn)可以注入Model,ModelAndView,@RequestParam,@PathVariable 等,那么這個是怎么實現(xiàn)的,以及怎么注入一個自定義的參數(shù)呢
HandlerMethodArgumentResolver
在SpringMVC中有一個接口HandlerMethodArgumentResolver,這個就是用來控制解析controller中的參數(shù)類型來進(jìn)行注入的,下面是一個自定義參數(shù)的例子
首先自定義resolver
注冊在配置文件中
<mvc:annotation-driven><mvc:argument-resolvers><bean class="web.controller.MyHandlerMethodArgumentResolver" /></mvc:argument-resolvers></mvc:annotation-driven>之后就可以使用了
@RequestMapping("test")@ResponseBodypublic String test(String a){return a;}在頁面訪問test連接顯示的就是自定義的“custom string”。
實現(xiàn)
下面來看下這個的實現(xiàn),在MVC啟動時會生成一個Resolver的Composite對象,這個包含了所有的注冊的Resolver
在HandlerMethodArgumentResolverComposite中有如下幾個方法
//每個參數(shù)都會調(diào)用resolveArgument進(jìn)行解析public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory)throws Exception {//獲得對應(yīng)的resolverHandlerMethodArgumentResolver resolver = getArgumentResolver(parameter);Assert.notNull(resolver, "Unknown parameter type [" + parameter.getParameterType().getName() + "]");//使用resolver進(jìn)行解析return resolver.resolveArgument(parameter, mavContainer, webRequest, binderFactory);}//獲得相應(yīng)的resolverprivate HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {//這里有個ConcurrentHashMap構(gòu)成的cache可以避免重復(fù)的解析HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);//如果cache沒有命中則進(jìn)行解析if (result == null) {//遍歷所有resolverfor (HandlerMethodArgumentResolver methodArgumentResolver : argumentResolvers) {if (logger.isTraceEnabled()) {logger.trace("Testing if argument resolver [" + methodArgumentResolver + "] supports [" +parameter.getGenericParameterType() + "]");}//找到對應(yīng)resolver并存入cacheif (methodArgumentResolver.supportsParameter(parameter)) {result = methodArgumentResolver;this.argumentResolverCache.put(parameter, result);break;}}}return result;}那自定義的resolver是如何被springmvc探測到的呢,這里列出argumentResolvers初始化時的賦值
// Annotation-based argument resolution//基于注解的resolver明顯有RequestParam,PathVariable等resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));resolvers.add(new RequestParamMapMethodArgumentResolver());resolvers.add(new PathVariableMethodArgumentResolver());resolvers.add(new ServletModelAttributeMethodProcessor(false));resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters()));resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters()));resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));resolvers.add(new RequestHeaderMapMethodArgumentResolver());resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));// Type-based argument resolution//基于類型的resolver如Request,Response等resolvers.add(new ServletRequestMethodArgumentResolver());resolvers.add(new ServletResponseMethodArgumentResolver());resolvers.add(new HttpEntityMethodProcessor(getMessageConverters()));resolvers.add(new RedirectAttributesMethodArgumentResolver());resolvers.add(new ModelMethodProcessor());resolvers.add(new MapMethodProcessor());resolvers.add(new ErrorsMethodArgumentResolver());resolvers.add(new SessionStatusMethodArgumentResolver());resolvers.add(new UriComponentsBuilderMethodArgumentResolver());// Custom arguments//這里就是自定義的了resolver了if (getCustomArgumentResolvers() != null) {resolvers.addAll(getCustomArgumentResolvers());}// Catch-all//墊底的resolver,第一個RequestParamMethodArgumentResolver與前面注冊的第二個構(gòu)造參數(shù)不同主要用來攔截未標(biāo)注注解的普通變量(如CharSequence,Number,List等)resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));resolvers.add(new ServletModelAttributeMethodProcessor(true));總結(jié)
本文看了自定義controller參數(shù)的解析過程
總結(jié)
以上是生活随笔為你收集整理的SPRING自定义注入CONTROLLER变量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java socketchannel a
- 下一篇: python写的程序怎么打包成exe_p