SpringBoot自定義Starter的教程指南
什么是SpringBoot Starter
SpringBoot Starter是一個(gè)特殊的依賴描述符,它包含了一系列的庫(kù)依賴,這些庫(kù)依賴定義了某個(gè)功能領(lǐng)域(如web應(yīng)用、數(shù)據(jù)庫(kù)訪問(wèn)等)所需的所有類庫(kù)。SpringBoot通過(guò)spring-boot-autoconfigure
模塊提供的自動(dòng)配置機(jī)制來(lái)自動(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ù)庫(kù)訪問(wèn)
- spring-boot-starter-data-jpa:集成Spring Data JPA和Hibernate,用于關(guān)系數(shù)據(jù)庫(kù)的操作。
- spring-boot-starter-data-mongodb:用于與MongoDB數(shù)據(jù)庫(kù)的集成。
- spring-boot-starter-data-redis:用于與Redis鍵值存儲(chǔ)的集成。
庫(kù)依賴
把具備某些功能的坐標(biāo)打包到一起,簡(jiǎn)化依賴導(dǎo)入。
比如導(dǎo)入了spring-boot-starter-web
這個(gè)starter,那么和web相關(guān)的jar包都一起自動(dòng)導(dǎo)入到項(xiàng)目中了。
自動(dòng)配置
無(wú)需手動(dòng)配置xml,由starter進(jìn)行自動(dòng)配置并管理bean,簡(jiǎn)化開發(fā)過(guò)程。
以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
一般來(lái)說(shuō),需要我們自定義 starter 的原因如下:
- 封裝功能:封裝一組特定的功能,使其可以輕松地在其他項(xiàng)目中復(fù)用。
- 簡(jiǎn)化配置:自動(dòng)配置相關(guān)類庫(kù),減少重復(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 倉(cāng)庫(kù)。
7)新建一個(gè)項(xiàng)目,并引入token-redis-spring-boot-starter
。
8)在配置文件中配置
9)測(cè)試運(yùn)行
輸出:127.0.0.1,0000,8888888
條件注解
在文中出現(xiàn)了好幾個(gè)類似于這樣的注解@ConditionalXXX
。
比如:@ConditionalOnProperty
、@ConditionalOnClass
、 @ConditionalOnMissingBean
@Conditional
是在 SpringFramework 4.0 版本正式推出的,它可以讓 Bean的裝載基于一些指定的條件,換句話說(shuō),被標(biāo)注@Conditional
注解的 Bean 要注冊(cè)到 IOC 容器時(shí),必須全部滿足@Conditional
上指定的所有條件才可以。
@ConditionalOnProperty
@ConditionalOnProperty
注解用于根據(jù)配置文件中的屬性值來(lái)決定是否加載某個(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容器中沒(méi)有MyService類型的Bean,那么myService方法將被調(diào)用以創(chuàng)建一個(gè)新的MyService Bean。
組合使用條件注解
這些條件注解可以單獨(dú)使用,也可以組合使用,以滿足更復(fù)雜的條件判斷需求。
例如,可以同時(shí)使用@ConditionalOnProperty
和@ConditionalOnClass
來(lái)確保某個(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?關(guān)鍵字break和continue的使用說(shuō)明
這篇文章主要介紹了Java?關(guān)鍵字break和continue的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究
這篇文章主要為大家介紹了Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01SpringBoot 錯(cuò)誤處理機(jī)制與自定義錯(cuò)誤處理實(shí)現(xiàn)詳解
這篇文章主要介紹了SpringBoot 錯(cuò)誤處理機(jī)制與自定義錯(cuò)誤處理實(shí)現(xiàn)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Jmeter基于JDBC請(qǐng)求實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)測(cè)試
這篇文章主要介紹了Jmeter基于JDBC請(qǐng)求實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Java File類 mkdir 不能創(chuàng)建多層目錄的解決
這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09spring boot實(shí)現(xiàn)自動(dòng)輸出word文檔功能的實(shí)例代碼
這篇文章主要介紹了spring boot實(shí)現(xiàn)自動(dòng)輸出word文檔功能的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)
這篇文章主要介紹了Java 添加、刪除、替換、格式化Word中的文本(基于Spire.Cloud.SDK for Java),本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08解決IntellIJ IDEA提示內(nèi)存不足的圖文教程
現(xiàn)在越來(lái)越多的人投入了 IntellIJ Idea 的懷抱, 它給我們的日常開發(fā)帶來(lái)了諸多便利,但是我們?cè)陂_發(fā)過(guò)程中,總是能碰到idea內(nèi)存不足問(wèn)題,所以本文給大家介紹了解決IntellIJ IDEA提示內(nèi)存不足的圖文教程,需要的朋友可以參考下2025-03-03