1. 程式人生 > >關於component-scan中base-package包含通配符的問題探究

關於component-scan中base-package包含通配符的問題探究

itl base 先來 csdn spa iss 結構 出現 ack

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管理。

關於component-scan中base-package包含通配符的問題探究