SPRING自定義注入CONTROLLER變量

問題描述
在SpringMVC中默認可以注入Model,ModelAndView,@RequestParam,@PathVariable 等,那么這個是怎么實現的,以及怎么注入一個自定義的參數呢

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

public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {//用來判斷參數是否支持當前resolver@Overridepublic boolean supportsParameter(MethodParameter parameter) {Class<?> klass = parameter.getParameterType();if (klass == String.class) {//這里使用參數類型匹配,MethodParameter還包含了方法注解和參數注解信息,可以使用它們來進行識別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”。

實現
下面來看下這個的實現,在MVC啟動時會生成一個Resolver的Composite對象,這個包含了所有的注冊的Resolver

在HandlerMethodArgumentResolverComposite中有如下幾個方法

 //每個參數都會調用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構成的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與前面注冊的第二個構造參數不同主要用來攔截未標注注解的普通變量(如CharSequence,Number,List等)resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));resolvers.add(new ServletModelAttributeMethodProcessor(true));

總結
本文看了自定義controller參數的解析過程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249966.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249966.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進程,線程

import os, timeif __name__ __main__:print(the calling process id:%d % os.getpid())# 創建進程pid os.fork()if pid 0:# 子進程print(the child pid is %d % os.getpid())time.sleep(3)elif pid > 0:# 父進程os.wait() # 等待子進程終止print([%d]bye-bye % os.getpi…

livebos--iframe使用

新建一個方法。建一個參數&#xff0c;iframe控件&#xff0c;虛擬列。然后使用以下信息 <% livebos languagejavascript %>var url LB_ObjURI("Lb_lbOrganization",0,[],["NoTitle"]);var v {"edit" : "url ", "view"…

單行溢出 和多行溢出

/*單行溢出*/.one_txt_cut{overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}.txt_cut{overflow : hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;}轉載于:https://www.cnblogs.com/smzd/p/8491583…

Spring方法注入 @Lookup注解使用

情景分析 在Spring的諸多應用場景中bean都是單例形式&#xff0c;當一個單利bean需要和一個非單利bean組合使用或者一個非單利bean和另一個非單利bean組合使用時&#xff0c;我們通常都是將依賴以屬性的方式放到bean中來引用&#xff0c;然后以Autowired來標記需要注入的屬性。…

Jupyter配置步驟

Jupyter是基于瀏覽器的可交互式開發工具&#xff0c;在數據科學界非常受歡迎&#xff0c;它功能齊全&#xff0c;使用方便&#xff0c;是一款數據分析和建模挖掘的利器。 本文簡介Jupyter的配置和使用過程 一、修改添加國內鏡像 通常我會先安裝Anaconda&#xff0c;再安裝Jupyt…

edittext 屬性

1.去掉edittext的底線&#xff0c;設置&#xff0c;不管是edittext&#xff0c;還是appcompatEdittext都是這個屬性 轉載于:https://www.cnblogs.com/hechangshou/p/9301004.html

定義高亮顏色

/*怎么定義高亮的顏色*/-webkit-tap-highlight-color: transparent;/*透明 其實就是不顯示顏色*/-webkit-tap-highlight-color: red; 轉載于:https://www.cnblogs.com/smzd/p/8491587.html

springboot 配置webservice接口

導入依賴的jar <!-- webservice cxf --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.1.6</version></dependency><dependency><groupId>org…

【Django】認證系統

目錄 #. auth模塊1. 認證 authenticate()2. 登陸 login(HttpRequest, user)3. 注銷 logout(request)4. 認證判斷 is_authenticated()5. 登陸校驗 login_requierd()6. 創建普通用戶 create_user()7. 創建超級用戶 create_superuser()8. 密碼校驗 check_password(password)9. 修改…

學習的目的是什么?

學習的目的是為了掌握生存的常識和技能&#xff0c;以便獨立地面對世界&#xff1b; 學習的目的是為了遵從生活的規范和律則&#xff0c;以便和諧地與人相處&#xff1b; 學習的目的是為了探索生命的價值和意義&#xff0c;以便有尊嚴地立于天地之間。 你覺得為什么要學習呢&am…

span里面插入文字

.text-box span::before{ content:attr(data-text);} 轉載于:https://www.cnblogs.com/smzd/p/8491664.html

Spring Boot 動態注入的兩種方式

通過Profilespring.profiles.active spring.profiles.active&#xff1a;官方解釋是激活不同環境下的配置文件&#xff0c;但是實際測試發現沒有對應的配置文件也是可以正常執行的。那就可以把這個key當作一個參數來使用 Profile&#xff1a;spring.profiles.active中激活某配…

kernel devel 安裝與卸載

1、查看系統內核 uname -r 2、查看已安裝kernel-devel uname -a ; rpm -qa kernel\* | sort 3、下載對應的rpm wget xxx/kernel-devel-2.6.32-754.el6.x86_64.rpm 或者 $ sudo yum install "kernel-devel-uname-r $(uname -r)" 4、卸載已安裝的內核 yum remove ker…

彈性布局

/* 開啟彈性布局的換行 */ flex-wrap: wrap;/* 變為多行了 無法使用 align-items 進行位置設置 align-content 在多行的時候 設置屬性 跟 justify-content 一模一樣如果只有 一行時 無法生效 *//* 調整元素 在主軸上的 排布方式flex-end 到主軸的末尾flex-start 默認值center…

詳解 vue-cli 的打包配置文件代碼(給大家寫寫注釋)

一、前言 對于webpack基礎不好&#xff0c;node指令不通的童鞋。估計對自己搭建Vue、react腳手架是相當頭疼的&#xff0c;有種無從下手的感覺。然而&#xff0c;從頭看這2塊&#xff0c;耗時太長&#xff0c;而且說實話得練才行&#xff0c;不練練手看不明白。那大多數人就采取…

AutoFac自動注入時報錯

錯誤描述&#xff1a;An error occurred during the activation of a particular registration 解決辦法&#xff1a;看到了particular這個單詞&#xff0c;用我蹩腳的英語&#xff0c;估計是部分類&#xff1f;結合報錯的兩個類存在互相引用&#xff0c;這就明白了&#xff0c…

嘗試修改源碼需要用到git存一下

git reflog查看本地記錄 git reset --hard 02a3260 轉載于:https://www.cnblogs.com/smzd/p/8492065.html

poj3713 Transferring Sylla 枚舉+tarjan判割點

其實就是判斷是否為三連通圖 三連通圖指的是去掉3個點就不連通的圖&#xff0c;但是并沒有直接求三連通的算法。著名的Tarjan算法可以求解連通和割點&#xff0c;再枚舉刪除一個點就能達到三連通的目的。 先看用例2&#xff0c;是由用例1去掉一條邊而變成非三連通圖的&#xff…

html標簽大全

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>This is study note</title><base href"我是做外鏈的&#xff0c;一般在head里面" target"_blank"><style type&q…

布爾文本搜索

select text from products where Match(# column) Against(#condition bool* IN BOOLEAN MODE); 布爾操作符     包含 必須存在 -    排除,必須不存在(即使包含其他指定的詞也不返回) >    增加排序等級 <    降低排序等級 ()    把詞組成子表達式 …