1. 程式人生 > >關於component-scan中base-package包含萬用字元的問題探究

關於component-scan中base-package包含萬用字元的問題探究

http://blog.csdn.net/u012325167/article/details/75388990

今天在配置Spring的component-scan時,發現了一個有趣的問題。就是在指定base-package時,如果使用了星號萬用字元*,有時會出現類掃描不到的情況。下面研究一下這個問題。

先介紹一下專案結構:  為了演示,我在java資料夾下建立名為controller的包,並在該包下建立了一個名為IndexController的類。如圖所示: 這裡寫圖片描述 這裡寫圖片描述

先來看正常情況:  在Spring配置檔案中配置Component-Scan: <context:component-scan base-package="controller" />

  啟動專案,訪問localhost:8080/index.do,結果正常。 這裡寫圖片描述

但,當我把component-scan配置成這樣時: <context:component-scan base-package="controller.*" />  出現了404,說明Spring沒有掃描到我的Controller,所以無法處理我們的請求。 這裡寫圖片描述

但,當我把component-scan配置成這樣時: <context:component-scan base-package="controller.**" />  又一切正常了。

這是為啥呢,我們打個斷點看一下:  當base-package="controller"

時,可見packageSearchPath為"classpath*:controller/**/*.class": 這裡寫圖片描述

base-package="controller.*"時,可見packageSearchPath為"classpath*:controller/*/**/*.class": 這裡寫圖片描述

base-package="controller.**"時,可見packageSearchPath為"classpath*:controller/**/**/*.class": 這裡寫圖片描述

綜上, 可以分析出,**匹配任意class檔案和包,而*只能匹配包,因此無法掃描到包下的類,因此也就無法被Spring管理。