今天在配置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管理。
版權聲明:本文為CSDN博主「陳夏明」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u012325167/article/details/75388990