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