springboot 目錄結構

hugh Lee發表於2017-06-15

問題的發現&解決

之前一直沒有覺得目錄結構有多麼重要,一直到 後面的程式碼與預期不符時 ,經過長時間的分析以及 Spring包掃描機制的存在 發現可能是目錄結構 哪塊不對,或者是 在配置處 哪裡出了問題(註解 以及 application.properties的配置上)

在最開始的時候,主要 配置類 處(Application.java),我並沒有用@SpringBootApplication而是 使用 @EnableAutoConfiguration,然而通過 @RequestMapping註解 只能訪問到 主要配置類 裡面有@RequestMapping註解 的方法,其他包下的其他類中的其他方法 都不能通過 @RequestMapping註解 訪問。

這個 問題困擾了我很久,一直沒找出來 有什麼毛病,最後嘗試 將@EnableAutoConfiguration註解 替換為@SpringBootApplication註解後,問題 開始浮現

啟動springboot時,出現如下報錯資訊


org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class:
 URL[jar:file:/home/chanllen/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/1.2.5.RELEASE/spring-boot-autoconfigure-1.2.5.RELEASE.jar!/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$JdbcTemplateConfiguration.class];
 This can happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake)

經過搜尋找到了答案:不應將Appication.java 檔案放在src/main/java下,要將它放在src/main/java下的根包裡(例如src/main/java/me/hugh 下),接著把其他包以及下面的類都移到 src/main/java/me/hugh 下,再次啟動就沒問題了

目錄結構

me
  +- hugh
     +- Application.java
     |
     +- domain
     |  +- Customer.java
     |  +- CustomerRepository.java
     |
     +- service
     |  +- CustomerService.java
     |
     +- web
     |  +- CustomerController.java
     |
  • root package結構:me.hugh
  • 應用主類Application.java置於root package下,通常我們會在應用主類中做一些框架配置掃描等配置,我們放在root package下可以幫助程式減少手工配置來載入到我們希望被Spring載入的內容
  • 實體(Entity)與資料訪問層(Repository)置於me.hugh.domain包下
  • 邏輯層(Service)置於com.hugh.service包下
  • Web層(web)置於com.hugh.web包下

相關文章