關於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" />
但,當我把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管理。