Spring Boot Starter 的應(yīng)用場(chǎng)景與自動(dòng)配置方式
前言
一、Spring Boo Starter 簡(jiǎn)介
在 SpringBoot 出現(xiàn)之前,如果我們想使用 SpringMVC 來(lái)構(gòu)建我們的 web 項(xiàng)目,必須要做的幾件事情如下:
- 首先項(xiàng)目中需要引入 SpringMVC 的依賴
- 在 web.xml 中注冊(cè) SpringMVC 的
DispatcherServlet,并配置url映射 - 編寫(xiě)
springmcv-servlet.xml,在其中配置幾個(gè)重要的組件,處理映射器(HandlerMapping)、處理適配器(HandlerAdapter)、視圖解析器(ViewResolver) - 在
applicationcontext.xml文件中引入springmvc-servlet.xml文件
以上這幾步只是配置好了 SpringMVC,如果我們還需要與數(shù)據(jù)庫(kù)進(jìn)行交互,就要在 application.xml 中配置數(shù)據(jù)庫(kù)連接池 DataSource,如果需要數(shù)據(jù)庫(kù)事務(wù),還需要配置 TransactionManager… 等等。
以上會(huì)帶來(lái)兩個(gè)明顯的問(wèn)題:
- 依賴導(dǎo)入問(wèn)題: 每個(gè)項(xiàng)目都需要來(lái)單獨(dú)維護(hù)自己所依賴的 jar 包,手動(dòng)導(dǎo)入依賴容易出錯(cuò),且無(wú)法統(tǒng)一集中管理。
- 配置繁瑣: 在引入依賴之后需要做繁瑣的配置,并且這些配置是每個(gè)項(xiàng)目來(lái)說(shuō)都是必要的,例如 web.xml 配置(Listener 配置、Filter 配置、Servlet 配置)、log4j 配置、數(shù)據(jù)庫(kù)連接池配置等。
而使用 Spring Boot 的 starters(場(chǎng)景啟動(dòng)器)解決上述的兩個(gè)痛點(diǎn),Spring Boot 通過(guò)將我們常用的功能場(chǎng)景抽取出來(lái),做成的一系列場(chǎng)景啟動(dòng)器。
我們只需要在項(xiàng)目中引入這些 starters,相關(guān)場(chǎng)景的所有依賴就會(huì)全部被導(dǎo)入進(jìn)來(lái),并且我們僅需要通過(guò)配置文件來(lái)進(jìn)行少量的配置就可以使用相應(yīng)的功能。
二、如何自定義 Starter
一般在企業(yè)開(kāi)發(fā)中,會(huì)有專門(mén)的 git 倉(cāng)庫(kù)(組)來(lái)統(tǒng)一放置各個(gè)系統(tǒng)對(duì)應(yīng)的 Starter 項(xiàng)目,其中會(huì)包括一個(gè)空的框架,拉取下來(lái)后我們就可以自己開(kāi)發(fā)了。
在開(kāi)發(fā)之前,我們需要知道常見(jiàn)的使用場(chǎng)景有哪些:
- API 調(diào)用: 將某系統(tǒng)的部分功能經(jīng)過(guò)封裝后通過(guò) API 暴露出去,方便內(nèi)部/外部系統(tǒng)調(diào)用,調(diào)用時(shí)需要經(jīng)過(guò)認(rèn)證;
- 基礎(chǔ)組件: 比如全局統(tǒng)一的 Http 組件、緩存組件和一些通用工具包等,目的是提升團(tuán)隊(duì)開(kāi)發(fā)效率和形成開(kāi)發(fā)規(guī)范;
- 底層框架: 主要是公司自研的系統(tǒng)框架,如 Netty 通信、Maven 插件、ORM 框架等等,用于項(xiàng)目開(kāi)發(fā)的基礎(chǔ)支持。
2.1命名規(guī)范
Spring Boot 官方推薦的命名規(guī)范如下:
- 前綴:spring-boot-starter-
- 模式:spring-boot-starter-模塊名
- 舉例:spring-boot-starter-web、spring-boot-starter-jdbc 等
我們自定義開(kāi)發(fā)推薦的命名:
- 前綴:xx-spring-boot-starter
- 模式:xx模塊-spring-boot-starter
- 舉例:業(yè)務(wù)線-系統(tǒng)名-spring-boot-starter、saas-user-spring-boot-starter等
2.2整體結(jié)構(gòu)
一個(gè) starter 的整體實(shí)現(xiàn)邏輯主要由兩個(gè)基本部分組成:
xxxAutoConfiguration:自動(dòng)配置類,對(duì)某個(gè)場(chǎng)景下需要使用到的一些組件進(jìn)行自動(dòng)注入,并利用xxxProperties類來(lái)進(jìn)行組件相關(guān)配置。xxxProperties:某個(gè)場(chǎng)景下所有可配置屬性的集成,在配置文件中配置可以進(jìn)行屬性值的覆蓋。
按照 SpringBoot 官方的定義,starer 的作用就是依賴聚合,因此直接在 starter 內(nèi)部去進(jìn)行代碼實(shí)現(xiàn)是不符合規(guī)定的,starter 應(yīng)該只起到依賴導(dǎo)入的作用,而具體的代碼實(shí)現(xiàn)應(yīng)該去交給其它服務(wù)/模塊來(lái)實(shí)現(xiàn)。
2.3模塊開(kāi)發(fā)
2.3.1依賴引入
首先所有的自動(dòng)配置模塊都要引入兩個(gè) jar 包依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<!-- 包含很多與自動(dòng)配置相關(guān)的注解的定義,必須要引入 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<!-- 可以通過(guò)其它 .properties 文件為相關(guān)類進(jìn)行屬性映射,SpringBoot 默認(rèn)使用 application.yml-->
<optional>true</optional>
</dependency>
<dependencies>2.3.2xxxAutoConfiguration的實(shí)現(xiàn)
xxxAutoconfigure 模塊中最重要的就是自動(dòng)配置類的編寫(xiě),它為我們實(shí)現(xiàn)組件的自動(dòng)配置與自動(dòng)注入。在編寫(xiě)自動(dòng)配置類的時(shí)候,我們應(yīng)該要考慮向容器中注入什么組件,如何去配置它。
@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的實(shí)現(xiàn)
這是跟配置文件相綁定的類,里邊的屬性就是我們可以在配置文件中配置的內(nèi)容,然后通過(guò)@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文件,并添加寫(xiě)好的xxxAutoConfiguration類:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.xx.xx.xx.autoconfigure.xxxAutoConfiguration
三、淺析 Spring Boot 自動(dòng)配置原理
在這一小節(jié)我將分析 Spring Boot 在創(chuàng)建 Stater 時(shí)主要幫我們完成的兩件最關(guān)鍵的事情:
- 相關(guān)組件的自動(dòng)導(dǎo)入
- 相關(guān)組件的自動(dòng)配置
這兩件事情統(tǒng)一稱為 SpringBoot 的自動(dòng)配置。
3.1自動(dòng)配置原理
我們從主程序入口來(lái)探索一下整個(gè)過(guò)程的原理:
@SpringBootApplication //標(biāo)注這個(gè)類是一個(gè) springboot 的應(yīng)用
public class MyApplication {
public static void main(String[] args) {
//將 springboot 應(yīng)用啟動(dòng)
SpringApplication.run(MyApplication.class, args);
}
}@SpringBootApplication注解內(nèi)部結(jié)構(gòu)如下圖3-1所示:

圖3-1
我們可以去到上邊提到的spring.factories文件中去看一下,找到 spring 官方提供的spring-boot-autoconfigure包,再去找一下該文件,如圖3-2所示:

圖3-2
可以看到這個(gè)就是SpringBoot官方為我們提供的所有自動(dòng)配置類的候選列表。
我們可以在其中找到一個(gè)我們比較熟悉的自動(dòng)配置類去看一下它內(nèi)部的實(shí)現(xiàn),可以看到這些一個(gè)個(gè)的都是JavaConfig配置類,而且都通過(guò)@Bean注解向容器中注入了一些 Bean,如圖3-3所示:

圖3-3
小結(jié):
- SpringBoot 在啟動(dòng)的時(shí)候從類路徑下的
META-INF/spring.factories中獲取 EnableAutoConfiguration 指定的所有自動(dòng)配置類的全限定類名; - 整個(gè) J2EE 的全部解決方案和自動(dòng)配置都在
spring-boot-autoconfigure的 jar 包中,將這些自動(dòng)配置類導(dǎo)入容器,自動(dòng)配置類就生效; - 上面2點(diǎn)會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類 (xxxAutoConfiguration), 就是給容器中導(dǎo)入這個(gè)場(chǎng)景需要的所有組件,并配置好這些組件 。
3.2自動(dòng)配置的過(guò)程
SpringBoot 中所有可配置項(xiàng)都集中在一個(gè)文件中(application.yml),這個(gè)文件中的配置通過(guò)@ConfigurationProperties注解來(lái)與我們程序內(nèi)部定義的 POJO
類來(lái)產(chǎn)生關(guān)聯(lián),這些 POJO 類統(tǒng)一命名為xxxProperties,并且這些xxxProperties類中各個(gè)屬性字段都有自己的默認(rèn)值。
這也是 SpringBoot 約定大于配置理念的體現(xiàn),盡可能減少開(kāi)發(fā)人員做選擇的次數(shù),但同時(shí)又不失靈活性。只要我們想,配置文件中的配置隨時(shí)可以覆蓋默認(rèn)值,如圖3-4所示:

圖3-4
小結(jié):
- 首先容器會(huì)根據(jù)當(dāng)前不同的條件判斷,決定這個(gè)配置類是否生效;
- 一但這個(gè)配置類生效,這個(gè)配置類就會(huì)給容器中添加相應(yīng)組件;
- 這些組件的屬性是從對(duì)應(yīng)的 properties 類中獲取的,這些類里面的每一個(gè)屬性又是和配置文件綁定的;
- 所有在配置文件中的屬性都是在 xxxxProperties 類中封裝著,配置文件可以配置什么內(nèi)容,可以參照該前綴對(duì)應(yīng)的屬性類中的屬性字段。
四、文章小結(jié)
到這里關(guān)于Spring Boot Starter 的應(yīng)用場(chǎng)景與自動(dòng)配置就分享完了,stater 的開(kāi)發(fā)和使用并不難,最重要的掌握使用場(chǎng)景和自動(dòng)配置,這樣無(wú)論是什么類型的 stater 都可以快速掌握運(yùn)用在項(xiàng)目里。
到此這篇關(guān)于Spring Boot Starter 的應(yīng)用場(chǎng)景與自動(dòng)配置的文章就介紹到這了,更多相關(guān)Spring Boot Starter配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot項(xiàng)目實(shí)現(xiàn)多數(shù)據(jù)源配置使用dynamic-datasource-spring-boot-starter的操作步驟
- SpringBoot自定義Starter與自動(dòng)配置實(shí)現(xiàn)方法詳解
- Spring?Boot自定義Starter組件開(kāi)發(fā)實(shí)現(xiàn)配置過(guò)程
- springboot配置多數(shù)據(jù)源的一款框架(dynamic-datasource-spring-boot-starter)
- SpringBoot2.1.x,創(chuàng)建自己的spring-boot-starter自動(dòng)配置模塊操作
- spring boot starter actuator(健康監(jiān)控)配置和使用教程
- SpringBoot入坑筆記之spring-boot-starter-web 配置文件的使用
- spring boot開(kāi)發(fā)遇到坑之spring-boot-starter-web配置文件使用教程
- 詳解spring boot starter redis配置文件
相關(guān)文章
springboot通過(guò)spel結(jié)合aop實(shí)現(xiàn)動(dòng)態(tài)傳參的案例
SpEl 是Spring框架中的一個(gè)利器,Spring通過(guò)SpEl能在運(yùn)行時(shí)構(gòu)建復(fù)雜表達(dá)式、存取對(duì)象屬性、對(duì)象方法調(diào)用等,今天通過(guò)本文給大家介紹springboot?spel結(jié)合aop實(shí)現(xiàn)動(dòng)態(tài)傳參,需要的朋友可以參考下2022-07-07
java實(shí)現(xiàn)全局監(jiān)聽(tīng)鍵盤(pán)詳解
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)全局監(jiān)聽(tīng)鍵盤(pán)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2024-01-01
Mybatis傳list參數(shù)調(diào)用oracle存儲(chǔ)過(guò)程的解決方法
怎么利用MyBatis傳List類型參數(shù)到數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程中實(shí)現(xiàn)批量插入數(shù)據(jù)?接下來(lái)通過(guò)本文給大家介紹Mybatis傳list參數(shù)調(diào)用oracle存儲(chǔ)過(guò)程,需要的朋友可以參考下2017-03-03
Win11系統(tǒng)下載安裝java的詳細(xì)過(guò)程
這篇文章主要介紹了Win11如何下載安裝java,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
如何把spring boot項(xiàng)目部署到tomcat容器中
本文給大家分享如何把spring boot項(xiàng)目部署到tomcat容器中,本文給大家介紹的非常詳細(xì),需要的朋友參考下2017-04-04
SpringBoot修改yml配置和加載順序規(guī)則的示例詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何修改yml配置和加載順序規(guī)則,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-08-08

