Spring Boot Starter 的應(yīng)用場景與自動(dòng)配置方式
前言
一、Spring Boo Starter 簡介
在 SpringBoot 出現(xiàn)之前,如果我們想使用 SpringMVC 來構(gòu)建我們的 web 項(xiàng)目,必須要做的幾件事情如下:
- 首先項(xiàng)目中需要引入 SpringMVC 的依賴
- 在 web.xml 中注冊(cè) SpringMVC 的
DispatcherServlet
,并配置url映射 - 編寫
springmcv-servlet.xml
,在其中配置幾個(gè)重要的組件,處理映射器(HandlerMapping)、處理適配器(HandlerAdapter)、視圖解析器(ViewResolver) - 在
applicationcontext.xml
文件中引入springmvc-servlet.xml
文件
以上這幾步只是配置好了 SpringMVC,如果我們還需要與數(shù)據(jù)庫進(jìn)行交互,就要在 application.xml 中配置數(shù)據(jù)庫連接池 DataSource,如果需要數(shù)據(jù)庫事務(wù),還需要配置 TransactionManager… 等等。
以上會(huì)帶來兩個(gè)明顯的問題:
- 依賴導(dǎo)入問題: 每個(gè)項(xiàng)目都需要來單獨(dú)維護(hù)自己所依賴的 jar 包,手動(dòng)導(dǎo)入依賴容易出錯(cuò),且無法統(tǒng)一集中管理。
- 配置繁瑣: 在引入依賴之后需要做繁瑣的配置,并且這些配置是每個(gè)項(xiàng)目來說都是必要的,例如 web.xml 配置(Listener 配置、Filter 配置、Servlet 配置)、log4j 配置、數(shù)據(jù)庫連接池配置等。
而使用 Spring Boot 的 starters(場景啟動(dòng)器)解決上述的兩個(gè)痛點(diǎn),Spring Boot 通過將我們常用的功能場景抽取出來,做成的一系列場景啟動(dòng)器。
我們只需要在項(xiàng)目中引入這些 starters,相關(guān)場景的所有依賴就會(huì)全部被導(dǎo)入進(jìn)來,并且我們僅需要通過配置文件來進(jìn)行少量的配置就可以使用相應(yīng)的功能。
二、如何自定義 Starter
一般在企業(yè)開發(fā)中,會(huì)有專門的 git 倉庫(組)來統(tǒng)一放置各個(gè)系統(tǒng)對(duì)應(yīng)的 Starter 項(xiàng)目,其中會(huì)包括一個(gè)空的框架,拉取下來后我們就可以自己開發(fā)了。
在開發(fā)之前,我們需要知道常見的使用場景有哪些:
- API 調(diào)用: 將某系統(tǒng)的部分功能經(jīng)過封裝后通過 API 暴露出去,方便內(nèi)部/外部系統(tǒng)調(diào)用,調(diào)用時(shí)需要經(jīng)過認(rèn)證;
- 基礎(chǔ)組件: 比如全局統(tǒng)一的 Http 組件、緩存組件和一些通用工具包等,目的是提升團(tuán)隊(duì)開發(fā)效率和形成開發(fā)規(guī)范;
- 底層框架: 主要是公司自研的系統(tǒng)框架,如 Netty 通信、Maven 插件、ORM 框架等等,用于項(xiàng)目開發(fā)的基礎(chǔ)支持。
2.1命名規(guī)范
Spring Boot 官方推薦的命名規(guī)范如下:
- 前綴:spring-boot-starter-
- 模式:spring-boot-starter-模塊名
- 舉例:spring-boot-starter-web、spring-boot-starter-jdbc 等
我們自定義開發(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è)場景下需要使用到的一些組件進(jìn)行自動(dòng)注入,并利用xxxProperties類來進(jìn)行組件相關(guān)配置。xxxProperties
:某個(gè)場景下所有可配置屬性的集成,在配置文件中配置可以進(jìn)行屬性值的覆蓋。
按照 SpringBoot 官方的定義,starer 的作用就是依賴聚合,因此直接在 starter 內(nèi)部去進(jìn)行代碼實(shí)現(xiàn)是不符合規(guī)定的,starter 應(yīng)該只起到依賴導(dǎo)入的作用,而具體的代碼實(shí)現(xiàn)應(yīng)該去交給其它服務(wù)/模塊來實(shí)現(xiàn)。
2.3模塊開發(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> <!-- 可以通過其它 .properties 文件為相關(guān)類進(jìn)行屬性映射,SpringBoot 默認(rèn)使用 application.yml--> <optional>true</optional> </dependency> <dependencies>
2.3.2xxxAutoConfiguration的實(shí)現(xiàn)
xxxAutoconfigure 模塊中最重要的就是自動(dòng)配置類的編寫,它為我們實(shí)現(xiàn)組件的自動(dòng)配置與自動(dòng)注入。在編寫自動(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)容,然后通過@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 自動(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)配置原理
我們從主程序入口來探索一下整個(gè)過程的原理:
@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配置類,而且都通過@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è)場景需要的所有組件,并配置好這些組件 。
3.2自動(dòng)配置的過程
SpringBoot 中所有可配置項(xiàng)都集中在一個(gè)文件中(application.yml),這個(gè)文件中的配置通過@ConfigurationProperties
注解來與我們程序內(nèi)部定義的 POJO
類來產(chǎn)生關(guān)聯(lián),這些 POJO 類統(tǒng)一命名為xxxProperties
,并且這些xxxProperties
類中各個(gè)屬性字段都有自己的默認(rèn)值。
這也是 SpringBoot 約定大于配置理念的體現(xiàn),盡可能減少開發(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)用場景與自動(dòng)配置就分享完了,stater 的開發(fā)和使用并不難,最重要的掌握使用場景和自動(dòng)配置,這樣無論是什么類型的 stater 都可以快速掌握運(yùn)用在項(xiàng)目里。
到此這篇關(guān)于Spring Boot Starter 的應(yī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組件開發(fā)實(shí)現(xiàn)配置過程
- 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開發(fā)遇到坑之spring-boot-starter-web配置文件使用教程
- 詳解spring boot starter redis配置文件
相關(guān)文章
Java ES(Elasticsearch) 中的and 和 or 查
Elasticsearch 是一個(gè)分布式、高擴(kuò)展、高實(shí)時(shí)的搜索與數(shù)據(jù)分析引擎,es中match查詢中,查詢字符串分詞后,默認(rèn)是or或者的關(guān)系,這篇文章主要介紹了ES 中的and 和 or 查詢,需要的朋友可以參考下2022-11-11Java中static和static?final的區(qū)別詳解
這篇文章主要介紹了Java中static和static?final的區(qū)別詳解,開發(fā)時(shí)我們經(jīng)常用到static以及static?final來修飾我們的字段變量,那么他們到底有什么區(qū)別呢?其實(shí)他們的區(qū)別可以用使用字節(jié)碼文件來解析,需要的朋友可以參考下2023-10-10Springboot中的@ConditionalOnBean注解詳細(xì)解讀
這篇文章主要介紹了Springboot中的@ConditionalOnBean注解詳細(xì)解讀,@ConditionalOnMissingBean注解兩個(gè)類,一個(gè)Computer類,一個(gè)配置類,想要完成;如果容器中沒有Computer類,就注入備用電腦Computer類,如果有Computer就不注入,需要的朋友可以參考下2023-11-11解決mybatis-plus通用mapper調(diào)用報(bào)錯(cuò):Invalid bound statement
這篇文章主要介紹了解決mybatis-plus通用mapper調(diào)用報(bào)錯(cuò):Invalid bound statement的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Springboot自定義mybatis攔截器實(shí)現(xiàn)擴(kuò)展
本文主要介紹了Springboot自定義mybatis攔截器實(shí)現(xiàn)擴(kuò)展,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12java 1.8 動(dòng)態(tài)代理源碼深度分析
下面小編就為大家?guī)硪黄猨ava 1.8 動(dòng)態(tài)代理源碼深度分析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06Java中的Runnable,Callable,F(xiàn)uture,F(xiàn)utureTask的比較
這篇文章主要介紹了Java中的Runnable,Callable,F(xiàn)uture,F(xiàn)utureTask的比較的相關(guān)資料,需要的朋友可以參考下2017-02-02設(shè)計(jì)模式之中介者模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了設(shè)計(jì)模式之中介者模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08