Spring Boot框架自己並無對工程結構有特別的要求,可是按照最佳實踐的工程結構能夠幫助咱們減小可能會碰見的坑,尤爲是Spring包掃描機制的存在,若是您使用最佳實踐的工程結構,能夠免去很多特殊的配置工做。java
如下結構是比較推薦的package組織方式:git
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
以及全部子包下的全部類來進行初始化。github
什麼意思呢?舉個例子,假設咱們將com.example.myproject.web
包與上面所述的root package
:com.example.myproject
放在同一級,像下面這樣:web
com +- example +- myproject +- Application.java | +- domain | +- Customer.java | +- CustomerRepository.java | +- service | +- CustomerService.java | +- web | +- CustomerController.java |
這個時候,應用主類Application.java
在默認狀況下就沒法掃描到com.example.myproject.web
中的Controller定義,就沒法初始化Controller中定義的接口。spring
那麼若是,咱們必定要加載非root package
下的內容怎麼辦呢?框架
方法一:使用@ComponentScan
註解指定具體的加載包,好比:dom
@SpringBootApplication @ComponentScan(basePackages="com.example") public class Bootstrap { public static void main(String[] args) { SpringApplication.run(Bootstrap.class, args); } }
這種方法經過註解直接指定要掃描的包,比較直觀。若是有這樣的需求也是能夠用的,可是原則上仍是推薦以上面的典型結構來定義,這樣也能夠少寫一些註解,代碼更加簡潔。spa
方法二:使用@Bean
註解來初始化,好比:code
@SpringBootApplication public class Bootstrap { public static void main(String[] args) { SpringApplication.run(Bootstrap.class, args); } @Bean public CustomerController customerController() { return new CustomerController(); } }
這種方法在業務開發的時候並非特別推薦,更適合用於框架封裝等場景,關於更多封裝上的技巧,後面咱們在進階教程中詳細講解。blog
若是讀者以爲本身團隊使用的工程結構不錯,歡迎留言分享~
本教程配套倉庫:
若是您以爲本文不錯,歡迎Star支持,您的關注是我堅持的動力!