基於註解的Spring MVC的URL與Controller映射關係提取的實現分析

      在Spring MVC中,定義了多種URL與Controller映射關係的描述方式。在基於註解的Spring MVC中,採用Java註解的方式描述URL與Controller之間的關係,那麼Spring MVC是如何獲取這些映射關係,並將其註冊到handlerMap中呢?這些問題將是本文研究的重點。

      Spring MVC使用HandlerMapping接口抽象表示通過請求獲取Controller的行爲,在使用註解驅動的Spring MVC中,HandlerMapping的具體實現類爲:DefaultAnnotationHandlerMapping,該類繼承自AbstractDetectingHandlerMapping,在AbstractDetectingHandlerMapping類中,定義了方法detectHandlers(),這個方法的目的在於取得所有可能的Controller,並將URL與Controller的映射關係註冊到handlerMap中。首先開一下這個方法的代碼實現。

      在AbstractDetectingHandlerMapping中,determineUrlsForHandler(String beanName)是一個抽象方法,由具體的子類給出實現,這裏我們需要關注的是DefaultAnnotationHandlerMapping類是如何實現該方法的。代碼如下:

      上述代碼是Spring處理類級別的RequestMapping註解,但是RequestMapping註解也可以定義在方法級別上,determineUrlsForHandlerMethods()方法是獲取該類中定義了RequestMapping註解的方法能夠處理的所有URL。下面看一下該方法的實現。

       分別獲取了類和方法級別的RequestMapping中定義的URL後,基本上完成了URL的提取工作,但是有一種情況需要處理:類和方法中同時定義了URL,這兩個URL是如何合併的呢?規則又是怎樣的呢?看一下URL合併代碼:

           通過以上的處理,基本上完成了bean可以處理的URL信息的提取,在代碼中有個方法經常出現:addUrlsForPath(),該方法的目的是將RequestMapping中定義的path添加的URL集合中,如果指定PATH不是以默認的方式結尾,那麼Spring將默認的結尾添加到該path上,並將處理結果添加到url集合中。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章