springMVC(5) HandlerMapping實現(xiàn)之BeanNameUrlHandlerMapping

這一次我們來看一下HandlerMapping的另一種實現(xiàn)方式BeanNameUrlHandlerMapping熄求。

配置文件

<bean name="/hello.htm" class="com.raistudies.ui.comtroller.HelloController"/>

<bean name="/sayHello*" class="com.raistudies.ui.comtroller.HelloController"/>

<bean id="urlHandler" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

好像完全看不出來"/hello.htm"和"/sayHello*"使用了BeanNameUrlHandlerMapping纪隙,因為它們之間直接都是分離的初橘,但為什么這樣可以調(diào)用BeanNameUrlHandlerMapping,我們看源碼來理解批什。

BeanNameUrlHandlerMapping類

public class BeanNameUrlHandlerMapping extends AbstractDetectingUrlHandlerMapping {

   /**
    * Checks name and aliases of the given bean for URLs, starting with "/".
    */
   @Override
   protected String[] determineUrlsForHandler(String beanName) {
      List<String> urls = new ArrayList<>();
      if (beanName.startsWith("/")) {
         urls.add(beanName);
      }
      String[] aliases = obtainApplicationContext().getAliases(beanName);
      for (String alias : aliases) {
         if (alias.startsWith("/")) {
            urls.add(alias);
         }
      }
      return StringUtils.toStringArray(urls);
   }

}

BeanNameUrlHandlerMapping類中只有一個determineUrlsForHandler廊佩,這個方法很短膝宁,所做的功能就是找到beanName所對應(yīng)的urls,簡單點理解urls應(yīng)該就是本名+別名欧聘。

不過有個細節(jié)我們需要注意自沧,那就是BeanNameUrlHandlerMapping只會處理那些前綴為"/"的urls。

接下來看BeanNameUrlHandlerMapping的父類树瞭。

AbstractDetectingUrlHandlerMapping類

首先從initApplicationContext()看起

public void initApplicationContext() throws ApplicationContextException {
   super.initApplicationContext();
   detectHandlers();
}

里面調(diào)用了detectHandlers()

protected void detectHandlers() throws BeansException {
   ApplicationContext applicationContext = obtainApplicationContext();
   if (logger.isDebugEnabled()) {
      logger.debug("Looking for URL mappings in application context: " + applicationContext);
   }
   String[] beanNames = (this.detectHandlersInAncestorContexts ?
         BeanFactoryUtils.beanNamesForTypeIncludingAncestors(applicationContext, Object.class) :
         applicationContext.getBeanNamesForType(Object.class));

   // Take any bean name that we can determine URLs for.
   for (String beanName : beanNames) {
      String[] urls = determineUrlsForHandler(beanName);
      if (!ObjectUtils.isEmpty(urls)) {
         // URL paths found: Let's consider it a handler.
         registerHandler(urls, beanName);
      }
      else {
         if (logger.isDebugEnabled()) {
            logger.debug("Rejected bean name '" + beanName + "': no URL paths identified");
         }
      }
   }
}

看到下面這行代碼

String[] beanNames = (this.detectHandlersInAncestorContexts ?
      BeanFactoryUtils.beanNamesForTypeIncludingAncestors(applicationContext, Object.class) :
      applicationContext.getBeanNamesForType(Object.class));

我們發(fā)現(xiàn)原來AbstractDetectingUrlHandlerMapping將配置文件中所有的bean都掃描了出來拇厢,因為Java中所有類都繼承Object。這也就解釋了最初的配置文件部分的疑問晒喷。

那么剩下的邏輯就很簡單了孝偎,就是將所有的以"/"開頭的url與其對應(yīng)handler進行綁定。

至于綁定邏輯和上一篇文章中所講的SimpleUrlHandlerMapping一樣了凉敲,因為它們都繼承了同一個父類AbstractUrlHandlerMapping衣盾。

總結(jié)

從源碼中我們可以理解BeanNameUrlHandlerMapping作為默認的HandlerMapping的原因寺旺,因為BeanNameUrlHandlerMapping掃描了配置文件中所有的bean。

注意事項:只有name開頭為"/"的bean才會被最終映射势决。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阻塑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子果复,更是在濱河造成了極大的恐慌陈莽,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虽抄,死亡現(xiàn)場離奇詭異走搁,居然都是意外死亡,警方通過查閱死者的電腦和手機迈窟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門私植,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人车酣,你說我怎么就攤上這事曲稼。” “怎么了湖员?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵躯肌,是天一觀的道長。 經(jīng)常有香客問我破衔,道長清女,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任晰筛,我火速辦了婚禮嫡丙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘读第。我一直安慰自己曙博,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布怜瞒。 她就那樣靜靜地躺著父泳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吴汪。 梳的紋絲不亂的頭發(fā)上惠窄,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音漾橙,去河邊找鬼杆融。 笑死,一個胖子當著我的面吹牛霜运,可吹牛的內(nèi)容都是我干的脾歇。 我是一名探鬼主播蒋腮,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼藕各!你這毒婦竟也來了池摧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤激况,失蹤者是張志新(化名)和其女友劉穎作彤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體誉碴,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡宦棺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年瓣距,在試婚紗的時候發(fā)現(xiàn)自己被綠了黔帕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹈丸,死狀恐怖成黄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逻杖,我是刑警寧澤奋岁,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站荸百,受9級特大地震影響闻伶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜够话,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一蓝翰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧女嘲,春花似錦畜份、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至愕鼓,卻和暖如春钙态,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菇晃。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工驯绎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谋旦。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓剩失,卻偏偏與公主長得像屈尼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拴孤,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容