spring4.0以上動態添加/註冊Controller和RequestMapping的方法

廢話不說,首先須要得到spring的上下文ApplicationContext的實現對象:ApplicationContext  context。java

而後在 context對象中找到RequestMappingHandlerMapping對象如代碼:spring

RequestMappingHandlerMapping requestMappingHandlerMapping=Context.getBean(RequestMappingHandlerMapping.class);

 

 

你們查看這個對象能夠看出有一個方法叫作:registerMapping。沒錯這個就是註冊requestmapping的方法。但是參數真的很難寫。因此我查看源碼後得出以下代碼:springboot

 

Method getMappingForMethod =ReflectionUtils.findMethod(RequestMappingHandlerMapping.class, "getMappingForMethod",Method.class,Class.class);
		getMappingForMethod.setAccessible(true);

 

 

經過spring的反射工具類得到getMappingForMethod方法,因爲這個方法是個私有的因此我須要設置一下使用權限。這時候咱們就能夠經過反射調用這個方法了,如代碼:app

RequestMappingInfo mapping_info = (RequestMappingInfo) getMappingForMethod.invoke(requestMappingHandlerMapping, m_d,entry.getValue());

 

經過查看源碼咱們能夠看出getMappingForMethod方法須要2個參數,分別是Method method, Class<?> handlerType。也就是須要註冊進去的方法(method)和這個方法所在類的類型(class),按照參數傳入便可。而後咱們就能夠調用registerMapping方法進行註冊了,如代碼:spring-boot

requestMappingHandlerMapping.registerMapping(mapping_info, entry.getValue().newInstance(),m_d);

 

第一個參數是剛纔咱們經過反射實例化的RequestMappingInfo對象,第二個RequestMappingInfo中第二個參數的實例化,第三個仍是RequestMappingInfo的第一個method類型對象。搞定!!可是這樣的實現主要是爲了熱加載外部jar包,將外部jar包的requestmapping註冊進spring,因此剩餘的代碼之後我會貼出來的工具

源碼如今已經整理完畢,一共分爲三個jar包,主jar包springboot-framework.jar是spring-boot項目,引入和啓動主要代碼包z-jarload.jar,test-mapping.jar是用於測試的須要被熱加載的包。測試

配置工做:在application.properties配置文件中配置framework.z.jarurl=E\:/jar1 選擇合適的路徑,在此路徑下是須要熱加載的jar包。jar包名稱必須用-mapping.jar結尾。jar包內帶有@RestController註解的類必須在com.z.mapping包下。url

https://pan.baidu.com/s/1OrhLr98pSIW_c2ZcCf-hwg  密碼:3aeicode

相關文章
相關標籤/搜索