【主流技術】Spring Boot Starter 的應用場景與自動配置
前言
一、Spring Boo Starter 簡介
在 SpringBoot 出現之前,如果我們想使用 SpringMVC 來構建我們的 web 項目,必須要做的幾件事情如下:
- 首先項目中需要引入 SpringMVC 的依賴
- 在 web.xml 中注冊 SpringMVC 的
DispatcherServlet,并配置url映射 - 編寫
springmcv-servlet.xml,在其中配置幾個重要的組件,處理映射器(HandlerMapping)、處理適配器(HandlerAdapter)、視圖解析器(ViewResolver) - 在
applicationcontext.xml文件中引入springmvc-servlet.xml文件
以上這幾步只是配置好了 SpringMVC,如果我們還需要與數據庫進行交互,就要在 application.xml 中配置數據庫連接池 DataSource,如果需要數據庫事務,還需要配置 TransactionManager… 等等。
以上會帶來兩個明顯的問題:
- 依賴導入問題: 每個項目都需要來單獨維護自己所依賴的 jar 包,手動導入依賴容易出錯,且無法統一集中管理。
- 配置繁瑣: 在引入依賴之后需要做繁瑣的配置,并且這些配置是每個項目來說都是必要的,例如 web.xml 配置(Listener 配置、Filter 配置、Servlet 配置)、log4j 配置、數據庫連接池配置等。
而使用 Spring Boot 的 starters(場景啟動器)解決上述的兩個痛點,Spring Boot 通過將我們常用的功能場景抽取出來,做成的一系列場景啟動器。
我們只需要在項目中引入這些 starters,相關場景的所有依賴就會全部被導入進來,并且我們僅需要通過配置文件來進行少量的配置就可以使用相應的功能。
二、如何自定義 Starter
一般在企業開發中,會有專門的 git 倉庫(組)來統一放置各個系統對應的 Starter 項目,其中會包括一個空的框架,拉取下來后我們就可以自己開發了。
在開發之前,我們需要知道常見的使用場景有哪些:
- API 調用: 將某系統的部分功能經過封裝后通過 API 暴露出去,方便內部/外部系統調用,調用時需要經過認證;
- 基礎組件: 比如全局統一的 Http 組件、緩存組件和一些通用工具包等,目的是提升團隊開發效率和形成開發規范;
- 底層框架: 主要是公司自研的系統框架,如 Netty 通信、Maven 插件、ORM 框架等等,用于項目開發的基礎支持。
2.1命名規范
Spring Boot 官方推薦的命名規范如下:
- 前綴:spring-boot-starter-
- 模式:spring-boot-starter-模塊名
- 舉例:spring-boot-starter-web、spring-boot-starter-jdbc 等
我們自定義開發推薦的命名:
- 前綴:xx-spring-boot-starter
- 模式:xx模塊-spring-boot-starter
- 舉例:業務線-系統名-spring-boot-starter、saas-user-spring-boot-starter等
2.2整體結構
一個 starter 的整體實現邏輯主要由兩個基本部分組成:
xxxAutoConfiguration:自動配置類,對某個場景下需要使用到的一些組件進行自動注入,并利用xxxProperties類來進行組件相關配置。xxxProperties:某個場景下所有可配置屬性的集成,在配置文件中配置可以進行屬性值的覆蓋。
按照 SpringBoot 官方的定義,starer 的作用就是依賴聚合,因此直接在 starter 內部去進行代碼實現是不符合規定的,starter 應該只起到依賴導入的作用,而具體的代碼實現應該去交給其它服務/模塊來實現。
2.3模塊開發
2.3.1依賴引入
首先所有的自動配置模塊都要引入兩個 jar 包依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<!-- 包含很多與自動配置相關的注解的定義,必須要引入 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<!-- 可以通過其它 .properties 文件為相關類進行屬性映射,SpringBoot 默認使用 application.yml-->
<optional>true</optional>
</dependency>
<dependencies>
2.3.2xxxAutoConfiguration的實現
xxxAutoconfigure 模塊中最重要的就是自動配置類的編寫,它為我們實現組件的自動配置與自動注入。在編寫自動配置類的時候,我們應該要考慮向容器中注入什么組件,如何去配置它。
@Configuration
@EnableConfigurationProperties(xxxProperties.class)
public class xxxAutoConfiguration {
@Resource
private xxxProperties properties;
@Bean
public static BeanYouNeed beanYouNeed() {
BeanYouNeed bean = new BeanYouNeed()
bean.setField(properties.get(field));
bean.setField(properties.get(field));
}
}
2.3.3 xxxProperties的實現
這是跟配置文件相綁定的類,里邊的屬性就是我們可以在配置文件中配置的內容,然后通過@ConfigurationProperties將其與配置文件綁定:
//使用 @ConfigurationProperties 注解綁定配置文件
@ConfigurationProperties(prefix = "your properties")
public class xxxProperties {
private String url;
private String key;
private String secret;
}
2.3.4配置spring.factories文件
在 resource 目錄下新建META-INF文件夾,在文件夾下新建spring.factories文件,并添加寫好的xxxAutoConfiguration類:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xx.xx.xx.autoconfigure.xxxAutoConfiguration
三、淺析 Spring Boot 自動配置原理
在這一小節我將分析 Spring Boot 在創建 Stater 時主要幫我們完成的兩件最關鍵的事情:
- 相關組件的自動導入
- 相關組件的自動配置
這兩件事情統一稱為 SpringBoot 的自動配置。
3.1自動配置原理
我們從主程序入口來探索一下整個過程的原理:
@SpringBootApplication //標注這個類是一個 springboot 的應用
public class MyApplication {
public static void main(String[] args) {
//將 springboot 應用啟動
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication注解內部結構如下圖3-1所示:
我們可以去到上邊提到的spring.factories文件中去看一下,找到 spring 官方提供的spring-boot-autoconfigure包,再去找一下該文件,如圖3-2所示:
可以看到這個就是SpringBoot官方為我們提供的所有自動配置類的候選列表。
我們可以在其中找到一個我們比較熟悉的自動配置類去看一下它內部的實現,可以看到這些一個個的都是JavaConfig配置類,而且都通過@Bean注解向容器中注入了一些 Bean,如圖3-3所示:
- SpringBoot 在啟動的時候從類路徑下的
META-INF/spring.factories中獲取 EnableAutoConfiguration 指定的所有自動配置類的全限定類名; - 整個 J2EE 的全部解決方案和自動配置都在
spring-boot-autoconfigure的 jar 包中,將這些自動配置類導入容器,自動配置類就生效; - 上面2點會給容器中導入非常多的自動配置類 (xxxAutoConfiguration), 就是給容器中導入這個場景需要的所有組件,并配置好這些組件 。
3.2自動配置的過程
SpringBoot 中所有可配置項都集中在一個文件中(application.yml),這個文件中的配置通過@ConfigurationProperties注解來與我們程序內部定義的 POJO
類來產生關聯,這些 POJO 類統一命名為xxxProperties,并且這些xxxProperties類中各個屬性字段都有自己的默認值。
這也是 SpringBoot 約定大于配置理念的體現,盡可能減少開發人員做選擇的次數,但同時又不失靈活性。只要我們想,配置文件中的配置隨時可以覆蓋默認值,如圖3-4所示:
小結:
- 首先容器會根據當前不同的條件判斷,決定這個配置類是否生效;
- 一但這個配置類生效,這個配置類就會給容器中添加相應組件;
- 這些組件的屬性是從對應的 properties 類中獲取的,這些類里面的每一個屬性又是和配置文件綁定的;
- 所有在配置文件中的屬性都是在 xxxxProperties 類中封裝著,配置文件可以配置什么內容,可以參照該前綴對應的屬性類中的屬性字段。
四、文章小結
到這里關于Spring Boot Starter 的應用場景與自動配置就分享完了,stater 的開發和使用并不難,最重要的掌握使用場景和自動配置,這樣無論是什么類型的 stater 都可以快速掌握運用在項目里。
最后,如果文章有不足和錯誤,還請大家指正。或者你有其它想說的,也歡迎大家在評論區交流!

一般在企業開發中,會有專門的 git 倉庫(組)來統一放置各個系統對應的 Starter 項目,其中會包括一個空的框架,拉取下來后我們就可以自己開發了。
在開發之前,我們需要知道常見的使用場景有哪些:
1、API 調用:將某系統的部分功能經過封裝后通過 API 暴露出去,方便內部/外部系統調用;
2、基礎組件:比如全局統一的 Http 組件、緩存組件和一些通用工具包等;
3、底層框架:主要是公司自研的系統框架。
浙公網安備 33010602011771號