維護項目很長時間,導致很久沒敲代碼了,昨天創建一個小項目,被一個小問題坑了。
說起來也是第一次用spring boot,照着官網例子,分分鐘就搞定了demo。然後往裏面添東西,寫了個測試接口,運行項目,訪問接口。竟然不能訪問!仔細看了下啓動日誌,發現@controller的類沒有被加載到spring。仔細看,沒發現哪裏寫錯了。還一直以爲編譯問題,所以clean了再編譯,再運行,然後就下班了,有事情就走了。今天上午仔細看了下項目,把controller的類放到Application的同級目錄,發現可以加載到了。突然意識到問題在於包名上。
spring boot的啓動類Application默認掃描的就是在Application類所在包以下的所有類,比如Application所在包爲com.xxx,那麼掃描的包就是com.xxx.*的所有包下面的類。
當然,我肯定不會願意妥協,幹嘛包名還得這麼固定,肯定有方式做到和常規spring項目一樣,根據表達式來管理掃描的包。也懶得上網搜,直接使用IDE的自帶提示功能找,找到@ComponentScan註解,同時看到@ComponentScans註解,那麼既然有帶s的,是不是這個支持的比不帶s的範圍廣呢。仔細看了下註解的源碼。發現跟我想的不一樣,
沒看明白,然後百度了一下,原來是java8的特性,註解可以重複使用。
官方文檔地址如下:
https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html
於是可以有如下用法
@ComponentScan("com.xxx1")
@ComponentScan("abc.xxx")
public xxx xxxx(){ xxxxx}