Spring Boot Starter 的應用場景與自動配置方式
前言
一、Spring Boo Starter 簡介
在 SpringBoot 出現(xiàn)之前,如果我們想使用 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 包,手動導入依賴容易出錯,且無法統(tǒng)一集中管理。
- 配置繁瑣: 在引入依賴之后需要做繁瑣的配置,并且這些配置是每個項目來說都是必要的,例如 web.xml 配置(Listener 配置、Filter 配置、Servlet 配置)、log4j 配置、數據庫連接池配置等。
而使用 Spring Boot 的 starters(場景啟動器)解決上述的兩個痛點,Spring Boot 通過將我們常用的功能場景抽取出來,做成的一系列場景啟動器。
我們只需要在項目中引入這些 starters,相關場景的所有依賴就會全部被導入進來,并且我們僅需要通過配置文件來進行少量的配置就可以使用相應的功能。
二、如何自定義 Starter
一般在企業(yè)開發(fā)中,會有專門的 git 倉庫(組)來統(tǒng)一放置各個系統(tǒng)對應的 Starter 項目,其中會包括一個空的框架,拉取下來后我們就可以自己開發(fā)了。
在開發(fā)之前,我們需要知道常見的使用場景有哪些:
- API 調用: 將某系統(tǒng)的部分功能經過封裝后通過 API 暴露出去,方便內部/外部系統(tǒng)調用,調用時需要經過認證;
- 基礎組件: 比如全局統(tǒng)一的 Http 組件、緩存組件和一些通用工具包等,目的是提升團隊開發(fā)效率和形成開發(fā)規(guī)范;
- 底層框架: 主要是公司自研的系統(tǒng)框架,如 Netty 通信、Maven 插件、ORM 框架等等,用于項目開發(fā)的基礎支持。
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è)務線-系統(tǒng)名-spring-boot-starter、saas-user-spring-boot-starter等
2.2整體結構
一個 starter 的整體實現(xiàn)邏輯主要由兩個基本部分組成:
xxxAutoConfiguration
:自動配置類,對某個場景下需要使用到的一些組件進行自動注入,并利用xxxProperties類來進行組件相關配置。xxxProperties
:某個場景下所有可配置屬性的集成,在配置文件中配置可以進行屬性值的覆蓋。
按照 SpringBoot 官方的定義,starer 的作用就是依賴聚合,因此直接在 starter 內部去進行代碼實現(xiàn)是不符合規(guī)定的,starter 應該只起到依賴導入的作用,而具體的代碼實現(xiàn)應該去交給其它服務/模塊來實現(xiàn)。
2.3模塊開發(fā)
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的實現(xiàn)
xxxAutoconfigure 模塊中最重要的就是自動配置類的編寫,它為我們實現(xiàn)組件的自動配置與自動注入。在編寫自動配置類的時候,我們應該要考慮向容器中注入什么組件,如何去配置它。
@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的實現(xiàn)
這是跟配置文件相綁定的類,里邊的屬性就是我們可以在配置文件中配置的內容,然后通過@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 自動配置原理
在這一小節(jié)我將分析 Spring Boot 在創(chuàng)建 Stater 時主要幫我們完成的兩件最關鍵的事情:
- 相關組件的自動導入
- 相關組件的自動配置
這兩件事情統(tǒng)一稱為 SpringBoot 的自動配置。
3.1自動配置原理
我們從主程序入口來探索一下整個過程的原理:
@SpringBootApplication //標注這個類是一個 springboot 的應用 public class MyApplication { public static void main(String[] args) { //將 springboot 應用啟動 SpringApplication.run(MyApplication.class, args); } }
@SpringBootApplication
注解內部結構如下圖3-1所示:
圖3-1
我們可以去到上邊提到的spring.factories
文件中去看一下,找到 spring 官方提供的spring-boot-autoconfigure
包,再去找一下該文件,如圖3-2所示:
圖3-2
可以看到這個就是SpringBoot官方為我們提供的所有自動配置類的候選列表。
我們可以在其中找到一個我們比較熟悉的自動配置類去看一下它內部的實現(xiàn),可以看到這些一個個的都是JavaConfig配置類,而且都通過@Bean
注解向容器中注入了一些 Bean,如圖3-3所示:
圖3-3
小結:
- SpringBoot 在啟動的時候從類路徑下的
META-INF/spring.factories
中獲取 EnableAutoConfiguration 指定的所有自動配置類的全限定類名; - 整個 J2EE 的全部解決方案和自動配置都在
spring-boot-autoconfigure
的 jar 包中,將這些自動配置類導入容器,自動配置類就生效; - 上面2點會給容器中導入非常多的自動配置類 (xxxAutoConfiguration), 就是給容器中導入這個場景需要的所有組件,并配置好這些組件 。
3.2自動配置的過程
SpringBoot 中所有可配置項都集中在一個文件中(application.yml),這個文件中的配置通過@ConfigurationProperties
注解來與我們程序內部定義的 POJO
類來產生關聯(lián),這些 POJO 類統(tǒng)一命名為xxxProperties
,并且這些xxxProperties
類中各個屬性字段都有自己的默認值。
這也是 SpringBoot 約定大于配置理念的體現(xiàn),盡可能減少開發(fā)人員做選擇的次數,但同時又不失靈活性。只要我們想,配置文件中的配置隨時可以覆蓋默認值,如圖3-4所示:
圖3-4
小結:
- 首先容器會根據當前不同的條件判斷,決定這個配置類是否生效;
- 一但這個配置類生效,這個配置類就會給容器中添加相應組件;
- 這些組件的屬性是從對應的 properties 類中獲取的,這些類里面的每一個屬性又是和配置文件綁定的;
- 所有在配置文件中的屬性都是在 xxxxProperties 類中封裝著,配置文件可以配置什么內容,可以參照該前綴對應的屬性類中的屬性字段。
四、文章小結
到這里關于Spring Boot Starter 的應用場景與自動配置就分享完了,stater 的開發(fā)和使用并不難,最重要的掌握使用場景和自動配置,這樣無論是什么類型的 stater 都可以快速掌握運用在項目里。
到此這篇關于Spring Boot Starter 的應用場景與自動配置的文章就介紹到這了,更多相關Spring Boot Starter配置內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- springboot項目實現(xiàn)多數據源配置使用dynamic-datasource-spring-boot-starter的操作步驟
- SpringBoot自定義Starter與自動配置實現(xiàn)方法詳解
- Spring?Boot自定義Starter組件開發(fā)實現(xiàn)配置過程
- springboot配置多數據源的一款框架(dynamic-datasource-spring-boot-starter)
- SpringBoot2.1.x,創(chuàng)建自己的spring-boot-starter自動配置模塊操作
- spring boot starter actuator(健康監(jiān)控)配置和使用教程
- SpringBoot入坑筆記之spring-boot-starter-web 配置文件的使用
- spring boot開發(fā)遇到坑之spring-boot-starter-web配置文件使用教程
- 詳解spring boot starter redis配置文件
相關文章
Java ES(Elasticsearch) 中的and 和 or 查
Elasticsearch 是一個分布式、高擴展、高實時的搜索與數據分析引擎,es中match查詢中,查詢字符串分詞后,默認是or或者的關系,這篇文章主要介紹了ES 中的and 和 or 查詢,需要的朋友可以參考下2022-11-11Java中static和static?final的區(qū)別詳解
這篇文章主要介紹了Java中static和static?final的區(qū)別詳解,開發(fā)時我們經常用到static以及static?final來修飾我們的字段變量,那么他們到底有什么區(qū)別呢?其實他們的區(qū)別可以用使用字節(jié)碼文件來解析,需要的朋友可以參考下2023-10-10Springboot中的@ConditionalOnBean注解詳細解讀
這篇文章主要介紹了Springboot中的@ConditionalOnBean注解詳細解讀,@ConditionalOnMissingBean注解兩個類,一個Computer類,一個配置類,想要完成;如果容器中沒有Computer類,就注入備用電腦Computer類,如果有Computer就不注入,需要的朋友可以參考下2023-11-11解決mybatis-plus通用mapper調用報錯:Invalid bound statement
這篇文章主要介紹了解決mybatis-plus通用mapper調用報錯:Invalid bound statement的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Springboot自定義mybatis攔截器實現(xiàn)擴展
本文主要介紹了Springboot自定義mybatis攔截器實現(xiàn)擴展,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12Java中的Runnable,Callable,F(xiàn)uture,F(xiàn)utureTask的比較
這篇文章主要介紹了Java中的Runnable,Callable,F(xiàn)uture,F(xiàn)utureTask的比較的相關資料,需要的朋友可以參考下2017-02-02