SpringBoot自定義Starter的教程指南
什么是SpringBoot Starter
SpringBoot Starter是一個(gè)特殊的依賴描述符,它包含了一系列的庫依賴,這些庫依賴定義了某個(gè)功能領(lǐng)域(如web應(yīng)用、數(shù)據(jù)庫訪問等)所需的所有類庫。SpringBoot通過spring-boot-autoconfigure模塊提供的自動(dòng)配置機(jī)制來自動(dòng)配置這些依賴。
Web應(yīng)用開發(fā)
- spring-boot-starter-web:用于創(chuàng)建Web應(yīng)用和RESTful服務(wù),包含Tomcat和Spring MVC。
- spring-boot-starter-webflux:用于構(gòu)建響應(yīng)式Web應(yīng)用,基于Reactor和Spring WebFlux。
數(shù)據(jù)庫訪問
- spring-boot-starter-data-jpa:集成Spring Data JPA和Hibernate,用于關(guān)系數(shù)據(jù)庫的操作。
- spring-boot-starter-data-mongodb:用于與MongoDB數(shù)據(jù)庫的集成。
- spring-boot-starter-data-redis:用于與Redis鍵值存儲(chǔ)的集成。
庫依賴
把具備某些功能的坐標(biāo)打包到一起,簡化依賴導(dǎo)入。
比如導(dǎo)入了spring-boot-starter-web這個(gè)starter,那么和web相關(guān)的jar包都一起自動(dòng)導(dǎo)入到項(xiàng)目中了。

自動(dòng)配置
無需手動(dòng)配置xml,由starter進(jìn)行自動(dòng)配置并管理bean,簡化開發(fā)過程。
以mybatis-spring-boot-starter為例。
1)當(dāng)引入了mybatis-spring-boot-starter后,其引入的相關(guān)依賴如下:

2)它導(dǎo)入了一個(gè)mybatis-spring-boot-autoconfigure 的jar包,其中有一個(gè)自動(dòng)配置類MybatisAutoConfiguration 。

3)打開看看,里面的關(guān)鍵代碼

4)其中@Configuration和@Bean注解,結(jié)合使用替代傳統(tǒng)的xml配置文件,把SqlSessionTemplate和SqlSessionFactory注入到Spring容器。
注解@EnableConfigurationProperties,其作用是讓后面指定的配置屬性MybatisProperties類生效。

把此類標(biāo)記為一個(gè)配置屬性類,prefix指定了前綴,其屬性就是配置的可選參數(shù)。
如配置包的別名:mybatis.type-aliases-package=com.yyh.entity。
5)那么這個(gè)MybatisAutoConfiguration類是怎么被加載的呢?
在META-INF/spring.factories文件中,定義了MybatisAutoConfiguration。

當(dāng) SpringBoot 應(yīng)用程序啟動(dòng)時(shí),會(huì)去加載該 jar 包下的META-INF/spring.factories文件。
詳情可以參考:SpringBoot自動(dòng)裝配原理解析
命名規(guī)范
spring-boot-starter-xxx是SpringBoot官方定義的jar,如 spring-bbot-starter-web。xxx-spring-boot-starter是非官網(wǎng)定義的,如第三方j(luò)ar包 mybatis-spring-boot-starter。
自定義 Starter
一般來說,需要我們自定義 starter 的原因如下:
- 封裝功能:封裝一組特定的功能,使其可以輕松地在其他項(xiàng)目中復(fù)用。
- 簡化配置:自動(dòng)配置相關(guān)類庫,減少重復(fù)的配置工作。
- 模塊化設(shè)計(jì):保持應(yīng)用的模塊化,將特定功能隔離在單獨(dú)的模塊中。
比如,我們現(xiàn)在要新建一個(gè) token-redis-spring-boot-starter。
1)新建項(xiàng)目,配置 pom。

2)在包util下創(chuàng)建類TokenProperties,此類是一個(gè)配置屬性類。

3)在包service下創(chuàng)建類TokenService,作為一個(gè)服務(wù)。

4)在包c(diǎn)onfig下創(chuàng)建類TokenAutoConfiguration,實(shí)現(xiàn)自動(dòng)配置,把服務(wù)注入到Spring中。

5)創(chuàng)建 spring.factories文件
#后面的路徑是TokenAutoConfiguration所在的路徑 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.demo.config.TokenAutoConfiguration
6)把項(xiàng)目打包發(fā)布到 maven 倉庫。
7)新建一個(gè)項(xiàng)目,并引入token-redis-spring-boot-starter。

8)在配置文件中配置

9)測試運(yùn)行

輸出:127.0.0.1,0000,8888888
條件注解
在文中出現(xiàn)了好幾個(gè)類似于這樣的注解@ConditionalXXX。
比如:@ConditionalOnProperty、@ConditionalOnClass、 @ConditionalOnMissingBean
@Conditional是在 SpringFramework 4.0 版本正式推出的,它可以讓 Bean的裝載基于一些指定的條件,換句話說,被標(biāo)注@Conditional注解的 Bean 要注冊(cè)到 IOC 容器時(shí),必須全部滿足@Conditional上指定的所有條件才可以。
@ConditionalOnProperty
@ConditionalOnProperty 注解用于根據(jù)配置文件中的屬性值來決定是否加載某個(gè)自動(dòng)配置類。
- 屬性名稱:可以指定一個(gè)或多個(gè)屬性名稱,只有當(dāng)這些屬性被設(shè)置時(shí),自動(dòng)配置類才會(huì)被加載。
- 屬性值:可以進(jìn)一步指定需要匹配的屬性值,只有當(dāng)屬性的值與指定值相匹配時(shí),自動(dòng)配置類才會(huì)被加載。
@Configuration
@EnableConfigurationProperties({TokenProperties.class})
@ConditionalOnProperty(
value = {"token.enabled"},
havingValue = "true"
)
public class TokenAutoConfiguration {
public TokenAutoConfiguration() {
}
@Bean
public TokenService tokenService() {
return new TokenService();
}
}
在這個(gè)例子中,只有當(dāng)配置文件中存在token.enabled屬性,TokenAutoConfiguration類才會(huì)被加載。
@ConditionalOnClass
@ConditionalOnClass 注解用于檢查類路徑上是否存在某個(gè)類,如果存在,則加載自動(dòng)配置類。
- classes:指定一個(gè)或多個(gè)類,如果這些類在類路徑上被找到,自動(dòng)配置類就會(huì)被加載。
@Configuration
@ConditionalOnClass(name = {"com.mysql.cj.jdbc.Driver"})
public class MySqlAutoConfiguration {
// ...
}
在這個(gè)例子中,只有當(dāng)類路徑上存在com.mysql.cj.jdbc.Driver類時(shí),MySqlAutoConfiguration類才會(huì)被加載,這通常意味著MySQL JDBC驅(qū)動(dòng)已經(jīng)添加到了項(xiàng)目的依賴中。
@ConditionalOnMissingBean
@ConditionalOnMissingBean 注解用于檢查Spring容器中是否已經(jīng)存在某個(gè)特定的Bean,如果不存在,則創(chuàng)建一個(gè)新的Bean。
- value:指定需要檢查的Bean的類型。
- search:指定搜索Bean的范圍,默認(rèn)為SearchStrategy.ALL,意味著在當(dāng)前上下文和父上下文中搜索。
@Configuration
public class MyServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean(MyService.class)
public MyService myService() {
return new DefaultMyService();
}
}
在這個(gè)例子中,如果Spring容器中沒有MyService類型的Bean,那么myService方法將被調(diào)用以創(chuàng)建一個(gè)新的MyService Bean。
組合使用條件注解
這些條件注解可以單獨(dú)使用,也可以組合使用,以滿足更復(fù)雜的條件判斷需求。
例如,可以同時(shí)使用@ConditionalOnProperty和@ConditionalOnClass來確保某個(gè)自動(dòng)配置類只在滿足特定屬性值和類路徑上有特定類時(shí)才被加載。
@Configuration
@ConditionalOnProperty(name = "myapp.enabled")
@ConditionalOnClass(name = "com.mysql.cj.jdbc.Driver")
public class MySqlAutoConfiguration {
// ...
}
在這個(gè)例子中,MySqlAutoConfiguration只有在配置文件中設(shè)置了myapp.enabled屬性,并且類路徑上存在com.mysql.cj.jdbc.Driver類時(shí)才會(huì)被加載。
以上就是SpringBoot自定義Starter的教程指南的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot自定義Starter的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java利用ffmpeg實(shí)現(xiàn)視頻MP4轉(zhuǎn)m3u8
本文綜合了下網(wǎng)上教程,從ffmpeg工具轉(zhuǎn)碼,ffmpeg視頻播放,java語言操控ffmpeg轉(zhuǎn)碼,轉(zhuǎn)碼后視頻上傳阿里云oss,四個(gè)方面完整記錄下這個(gè)流程,需要的朋友可以參考下2024-02-02
Java簡單使用EasyExcel操作讀寫excel的步驟與要點(diǎn)
相信現(xiàn)在很多搞后端的同學(xué)大部分做的都是后臺(tái)管理系統(tǒng),那么管理系統(tǒng)就肯定免不了Excel的導(dǎo)出導(dǎo)入功能,下面這篇文章主要給大家介紹了關(guān)于Java簡單使用EasyExcel操作讀寫excel的步驟與要點(diǎn),需要的朋友可以參考下2022-09-09
超詳細(xì)介紹idea中java程序打jar包的兩種方式
這篇文章主要介紹了超詳細(xì)介紹idea中java程序打jar包的兩種方式一種是可直接執(zhí)行的runnable jar文件,另一種是包含多個(gè)主類,運(yùn)行時(shí)需要指定主類全類名的jar包,感興趣的可以了解一下2020-07-07
Springboot MultipartFile文件上傳與下載的實(shí)現(xiàn)示例
在Spring Boot項(xiàng)目中,可以使用MultipartFile類來處理文件上傳和下載操作,本文就詳細(xì)介紹了如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
淺談Java中隨機(jī)數(shù)的幾種實(shí)現(xiàn)方式
這篇文章主要介紹了Java中隨機(jī)數(shù)的幾種實(shí)現(xiàn)方式,從最簡單的Math.random到多線程的并發(fā)實(shí)現(xiàn)都在本文所列之中,需要的朋友可以參考下2015-07-07

