Spring Boot框架本身並沒有對工程結構有特別的要求,但是按照最佳實踐的工程結構可以幫助我們減少可能會遇見的坑,尤其是Spring包掃描機制的存在,如果您使用最佳實踐的工程結構,可以免去不少特殊的配置工作。
典型示例
以下結構是比較推薦的package組織方式:
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
| +- CustomerController.java
|
root package
:com.example.myproject
,所有的類和其他package都在root package之下。- 應用主類:
Application.java
,該類直接位於root package
下。通常我們會在應用主類中做一些框架配置掃描等配置,我們放在root package下可以幫助程式減少手工配置來載入到我們希望被Spring載入的內容 com.example.myproject.domain
包:用於定義實體對映關係與資料訪問相關的介面和實現com.example.myproject.service
包:用於編寫業務邏輯相關的介面與實現com.example.myproject.web
:用於編寫Web層相關的實現,比如:Spring MVC的Controller等
上面的結構中,root package
與應用主類的位置是整個結構的關鍵。由於應用主類在root package
中,所以按照上面的規則定義的所有其他類都處於root package
下的其他子包之後。預設情況下,Spring Boot的應用主類會自動掃描root package
以及所有子包下的所有類來進行初始化。
什麼意思呢?舉個例子,假設我們將com.example.myproject.web
包與上面所述的root package
:com.example.myproject
放在同一級,像下面這樣:
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
| +- CustomerController.java
|
這個時候,應用主類Application.java
在預設情況下就無法掃描到com.example.myproject.web
中的Controller定義,就無法初始化Controller中定義的介面。
非典型結構下的初始化
那麼如果,我們一定要載入非root package
下的內容怎麼辦呢?
方法一:使用@ComponentScan
註解指定具體的載入包,比如:
@SpringBootApplication
@ComponentScan(basePackages="com.example")
public class Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Bootstrap.class, args);
}
}
這種方法通過註解直接指定要掃描的包,比較直觀。如果有這樣的需求也是可以用的,但是原則上還是推薦以上面的典型結構來定義,這樣也可以少寫一些註解,程式碼更加簡潔。
方法二:使用@Bean
註解來初始化,比如:
@SpringBootApplication
public class Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Bootstrap.class, args);
}
@Bean
public CustomerController customerController() {
return new CustomerController();
}
}
這種方法在業務開發的時候並不是特別推薦,更適合用於框架封裝等場景,關於更多封裝上的技巧,後面我們在進階教程中詳細講解。
如果讀者覺得自己團隊使用的工程結構不錯,歡迎留言分享~
程式碼示例
本教程配套倉庫:
- Github:https://github.com/dyc87112/SpringBoot-Learning/tree/2.x
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/tree/2.x
如果您覺得本文不錯,歡迎Star支援,您的關注是我堅持的動力!