日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringMVC自定义注入controller变量

發(fā)布時間:2025/3/17 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringMVC自定义注入controller变量 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題描述

在SpringMVC中默認可以注入Model,ModelAndView,@RequestParam,@PathVariable 等,那么這個是怎么實現(xiàn)的,以及怎么注入一個自定義的參數(shù)呢

HandlerMethodArgumentResolver

在SpringMVC中有一個接口HandlerMethodArgumentResolver,這個就是用來控制解析controller中的參數(shù)類型來進行注入的,下面是一個自定義參數(shù)的例子
首先自定義resolver

public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {//用來判斷參數(shù)是否支持當前resolver@Overridepublic boolean supportsParameter(MethodParameter parameter) {Class<?> klass = parameter.getParameterType();if (klass == String.class) {//這里使用參數(shù)類型匹配,MethodParameter還包含了方法注解和參數(shù)注解信息,可以使用它們來進行識別return true;}return false;}//真正返回要注入的值@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,WebDataBinderFactory binderFactory) throws Exception {return "custom string";} }

注冊在配置文件中

<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進行解析public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory)throws Exception {//獲得對應的resolverHandlerMethodArgumentResolver resolver = getArgumentResolver(parameter);Assert.notNull(resolver, "Unknown parameter type [" + parameter.getParameterType().getName() + "]");//使用resolver進行解析return resolver.resolveArgument(parameter, mavContainer, webRequest, binderFactory);}//獲得相應的resolverprivate HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {//這里有個ConcurrentHashMap構(gòu)成的cache可以避免重復的解析HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);//如果cache沒有命中則進行解析if (result == null) {//遍歷所有resolverfor (HandlerMethodArgumentResolver methodArgumentResolver : argumentResolvers) {if (logger.isTraceEnabled()) {logger.trace("Testing if argument resolver [" + methodArgumentResolver + "] supports [" +parameter.getGenericParameterType() + "]");}//找到對應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ù)不同主要用來攔截未標注注解的普通變量(如CharSequence,Number,List等)resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));resolvers.add(new ServletModelAttributeMethodProcessor(true));

總結(jié)

本文看了自定義controller參數(shù)的解析過程

轉(zhuǎn)載于:https://www.cnblogs.com/resentment/p/5865597.html

總結(jié)

以上是生活随笔為你收集整理的SpringMVC自定义注入controller变量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。