天天看點

Spring Boot 2.x基礎教程:工程結構推薦

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();
    }

}           

這種方法在業務開發的時候并不是特别推薦,更适合用于架構封裝等場景,關于更多封裝上的技巧,後面我們在進階教程中詳細講解。

如果讀者覺得自己團隊使用的工程結構不錯,歡迎留言分享~

代碼示例

本教程配套倉庫:

如果您覺得本文不錯,歡迎Star支援,您的關注是我堅持的動力!