SpringBoot如何自定義starter
1. 什么是starter
Springboot
的出現(xiàn)極大的簡化了開發(fā)人員的配置,而這之中的一大利器便是springboot的starter
,starter是springboot的核心組成部分,為什么說引入如下依賴就滿足了日常web開發(fā)?
<dependency> ? <groupId>org.springframework.boot</groupId> ? <artifactId>spring-boot-starter-web</artifactId> </dependency>
而不使用springboot
時,需要引入spring-web
、spring-webmvc
、spring-aop
等等。實際上那些必要的依賴在spring-boot-starter-web
中已經(jīng)被引入了,引入這個組名就引入了所有的依賴。
2. 自動配置原理
springboot在啟動的時候會加載主配置類,開啟了@EnableAutoConfiguration
。
@EnableAutoConfiguration的作用:
利用AutoConfigurationImportSelector
給容器導(dǎo)入一些組件。
查看selectImports
方法的內(nèi)容,返回一個AutoConfigurationEntry
可以看到SpringFactoriesLoader.loadFactoryNames
,繼續(xù)看又調(diào)用了loadSpringFactories
方法,獲取META-INF/spring.factories資源文件。這個spring.factories文件也是一組一組的key=value的形式,其中一個key是EnableAutoConfiguration類的全類名,而它的value是一個xxxxAutoConfiguration的類名的列表,這些類名以逗號分隔,最后都加入到容器中,用來做自動配置,每一個自動配置類都可以進行自動配置功能使用HttpEncodingAutoConfiguration來解釋自動裝配原理。根據(jù)當(dāng)前不同的條件判斷,決定這個配置類是否生效!
2.1 自動配置生效
每一個XxxxAutoConfiguration自動配置類都是在某些條件之下才會生效的,這些條件的限制在Spring Boot中以注解的形式體現(xiàn),
常見的條件注解有如下幾項:
- @Conditional擴展注解 作用
- @ConditionalOnJava 系統(tǒng)的java版本是否符合要求
- @ConditionalOnBean 容器中存在指定Bean
- @ConditionalOnMissingBean 容器中不存在指定Bean
- @ConditionalOnExpression 滿足SpEL表達式
- @ConditionalOnClass 系統(tǒng)中有指定的類
- @ConditionalOnMissingClass 系統(tǒng)中沒有指定的類
- @ConditionalOnSingleCandidate 容器中只有一個指定的Bean,或者是首選Bean
- @ConditionalOnProperty 系統(tǒng)中指定的屬性是否有指定的值
- @ConditionalOnResource 類路徑下是否存在指定資源文件
- @ConditionOnWebApplication 當(dāng)前是web環(huán)境
- @ConditionalOnNotWebApplication 當(dāng)前不是web環(huán)境
自動配置原理總結(jié)如下:
- 1、Spring Boot啟動的時候會通過
@EnableAutoConfiguration
注解找到META-INF/spring.factories
配置文件中的所有自動配置類進行加載 - 2、這些自動配置類都是以
AutoConfiguration
結(jié)尾來命名的,它實際上就是一個JavaConfig形式的Spring容器配置類 - 3、自動配置類通過以Properties結(jié)尾命名的類中取得在全局配置文件中配置的屬性如:
server.port
,而XxxxProperties類是通過@ConfigurationProperties注解與全局配置文件中對應(yīng)的屬性進行綁定的。
3. 自定義starter
spring-boot有兩種starter:
一種是內(nèi)部已經(jīng)支持的,其通過@ConditionalOnClass
來實決定是否例化(ConditionalOnClass是指當(dāng)在classpath發(fā)現(xiàn)需要的依賴的類時實例化),想要啟動這個服務(wù),只要要配置上對應(yīng)的starter,這個starter就能把所需要的jar給關(guān)聯(lián)上。
一種是第三方的,比如mybatis等。原理是一樣的,就是在你已經(jīng)實現(xiàn)的服務(wù)代碼之上封裝一層配置代碼就行。
基于這個機制,我們自己也可以實現(xiàn)一個。自定義starter,我們要做的事情是兩個:確定依賴和編寫自動配置。我們重點要做的就是編寫自動配置,我們之前寫過一些自動配置,主要是注解配置的使用,主要的注解有:
- @Configuration :指定這個類是一個配置類
- @ConditionalOnXXX :在指定條件成立的情況下自動配置類生效
- @AutoConfigureAfter:指定自動配置類的順序
- @Bean:給容器中添加組件
- @ConfigurationPropertie:結(jié)合相關(guān)xxxProperties類來綁定相關(guān)的配置
- @EnableConfigurationProperties:讓xxxProperties生效加入到容器中
3.1 命名規(guī)范
SpringBoot
提供的starter
以spring-boot-starter-xxx的方式命名的。官方建議自定義的starter使用xxx-spring-boot-starter命名規(guī)則。以區(qū)分SpringBoot生態(tài)提供的starter。
官方命名空間:
- 前綴:
“spring-boot-starter-”
- 模式:
spring-boot-starter-
模塊名 - 舉例:
spring-boot-starter-web
、spring-boot-starter-jdbc
自定義命名空間:
- 后綴:
“-spring-boot-starter”
- 模式:模塊
-spring-boot-starter
- 舉例:
druid-spring-boot-starter
、mybatis-spring-boot-starter
4.總結(jié)
Starter可以理解為一個可拔插式的插件,提供一系列便利的依賴描述符,您可以獲得所需的所有Spring和相關(guān)技術(shù)的一站式服務(wù)。應(yīng)用程序只需要在maven中引入starter
依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應(yīng)的默認配置。
4.1為什么要自定義starter?
在我們的日常開發(fā)工作中,經(jīng)常會有一些獨立于業(yè)務(wù)之外的配置模塊,我們經(jīng)常將其放到一個特定的包下,然后如果另一個工程需要復(fù)用這塊功能的時候,需要將代碼硬拷貝到另一個工程,重新集成一遍,麻煩至極。如果我們將這些可獨立于業(yè)務(wù)代碼之外的功能配置模塊封裝成一個個starter,復(fù)用的時候只需要將其在pom中引用依賴即可。
4.2 自定義starter的案例
以下案例由筆者工作中遇到的部分場景
動態(tài)數(shù)據(jù)源。 — fs-dynamic-starter
登錄模塊(權(quán)限)。— fs-auth-client-starter
基于AOP技術(shù)實現(xiàn)日志切面。—fs-common-starter
案例地址:https://gitee.com/Manoninsight/fullset/tree/master/fs-starter
這里還有一個小細節(jié),你如果仔細查看我的案例會發(fā)下一個問題,就是我自定義的starter里并沒有META-INF/spring.factories
配置文件,為什么還能生效呢?這是因為我的項目用的統(tǒng)一的包路徑:com.fs。spring配置默認會掃描當(dāng)前的包路徑,所以能加載到。但是筆者建議還是加上META-INF/spring.factories配置文件。
到此這篇關(guān)于SpringBoot如何自定義starter的文章就介紹到這了,更多相關(guān)SpringBoot自定義starter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- spring boot 自定義starter的實現(xiàn)教程
- springboot自定義Starter的具體流程
- Spring boot創(chuàng)建自定義starter的完整步驟
- spring boot微服務(wù)自定義starter原理詳解
- springboot自定義starter實現(xiàn)過程圖解
- springboot自定義redis-starter的實現(xiàn)
- SpringBoot自動配置之自定義starter的實現(xiàn)代碼
- 使用SpringBoot自定義starter的完整步驟
- Java SpringBoot自定義starter詳解
- SpringBoot自定義start詳細圖文教程
相關(guān)文章
Java面試??贾瓹oncurrentHashMap多線程擴容機制詳解
幾乎所有的后端技術(shù)面試官都要在?ConcurrentHashMap?技術(shù)的使用和原理方面對小伙伴們進行刁難,本文主要來和大家聊聊ConcurrentHashMap多線程的擴容機制,希望對大家有所幫助2023-05-05SpringBoot中關(guān)于static和templates的注意事項以及webjars的配置
今天小編就為大家分享一篇關(guān)于SpringBoot中關(guān)于static和templates的注意事項以及webjars的配置,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01springboot無法從靜態(tài)上下文中引用非靜態(tài)變量的解決方法
這篇文章主要介紹了springboot無法從靜態(tài)上下文中引用非靜態(tài)變量的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-06-06使用Jenkins配置Git+Maven的自動化構(gòu)建的方法
這篇文章主要介紹了使用Jenkins配置Git+Maven的自動化構(gòu)建的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01