springboot starter介紹與自定義starter示例詳解
springboot starter簡(jiǎn)介
Starter 是什么
Spring Boot 的 Starter 是一組比較方便的依賴描述符,可以通過 Maven 將其打成jar包,并在你的項(xiàng)目中直接引用。
通過 Starter 你可以獲取該功能的所有依賴,以及統(tǒng)一的配置,避免了復(fù)制、粘貼代碼和依賴帶來的麻煩。
Starter 主要使用了自動(dòng)配置,所以它下面的所有組件會(huì)被 Spring Boot 通過META-INF/spring.factories文件注入IOC容器中。
什么是SpringBoot starter機(jī)制
SpringBoot中的starter是一種非常重要的機(jī)制(自動(dòng)化配置),能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)starter,應(yīng)用者只需要在maven中引入starter依賴,SpringBoot就能自動(dòng)掃描到要加載的信息并啟動(dòng)相應(yīng)的默認(rèn)配置。starter讓我們擺脫了各種依賴庫(kù)的處理,需要配置各種信息的困擾。SpringBoot會(huì)自動(dòng)通過classpath路徑下的類發(fā)現(xiàn)需要的Bean,并注冊(cè)進(jìn)IOC容器。SpringBoot提供了針對(duì)日常企業(yè)應(yīng)用研發(fā)各種場(chǎng)景的spring-boot-starter依賴模塊。所有這些依賴模塊都遵循著約定成俗的默認(rèn)配置,并允許我們調(diào)整這些配置,即遵循“約定大于配置”的理念。
啟動(dòng)器starter命名
#官方
spring-boot-starter-jdbc
spring-boot-starter-web
spring-boot-starter-freemarker
#第三方
sms-spring-boot-starter
myLog-spring-boot-starter
配置項(xiàng)的命名規(guī)范
如果自定義的 Starter 包含了配置項(xiàng),請(qǐng)為它使用唯一的命名空間,不要與 Spring Boot 或其他組件產(chǎn)生沖突,例如:server
、spring
等
為什么要自定義starter
在我們的日常開發(fā)工作中,經(jīng)常會(huì)有一些獨(dú)立于業(yè)務(wù)之外的配置模塊,我們經(jīng)常將其放到一個(gè)特定的包下,
然后如果另一個(gè)工程需要復(fù)用這塊功能的時(shí)候,需要將代碼硬拷貝到另一個(gè)工程,重新集成一遍,麻煩至極。
如果我們將這些可獨(dú)立于業(yè)務(wù)代碼之外的功能配置模塊封裝成一個(gè)個(gè)starter,復(fù)用的時(shí)候只需要將其在pom中引用依賴即可,
SpringBoot為我們完成自動(dòng)裝配,簡(jiǎn)直不要太爽
什么時(shí)候需要?jiǎng)?chuàng)建自定義starter
在我們的日常開發(fā)工作中,可能會(huì)需要開發(fā)一個(gè)通用模塊,以供其它工程復(fù)用。SpringBoot就為我們提供這樣的功能機(jī)制,
我們可以把我們的通用模塊封裝成一個(gè)個(gè)starter,這樣其它工程復(fù)用的時(shí)候只需要在pom中引用依賴即可,
由SpringBoot為我們完成自動(dòng)裝配。
常見場(chǎng)景:
1.通用模塊-短信發(fā)送模塊
2.基于AOP技術(shù)實(shí)現(xiàn)日志切面
3.微服務(wù)項(xiàng)目的數(shù)據(jù)庫(kù)連接池配置
4.微服務(wù)項(xiàng)目的每個(gè)模塊都要訪問redis數(shù)據(jù)庫(kù),每個(gè)模塊都要配置redisTemplate
也可以通過starter解決
自定義Starter所需依賴
在POM中引入兩個(gè)依賴:
- spring-boot-starter:該依賴是 Starter 的核心,包括自動(dòng)配置、日志和YAML的支持。我們所有自定義的 Starter 都應(yīng)該直接或間接的引入該依賴。
- spring-boot-configuration-processor:包含一個(gè) Java 注解處理器,當(dāng)使用@ConfigurationProperties注解配置自己的元數(shù)據(jù)時(shí),需要引入此依賴。其作用是生產(chǎn)配置元數(shù)據(jù),能夠在配置文件中給與提示,比如server.port
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
其中<optional>true</optional>
父模塊的依賴中添加<optional>true</optional>
,在這種情況下,在子模塊中會(huì)直接下載該依賴jar包,對(duì)于<optional>true</optional>
來說,父模塊中是否加上<dependencyManagement>
都一樣,都是需要顯示調(diào)用才能引用該依賴的jar包
相關(guān)注解含義
@Configuration //指定這個(gè)類是一個(gè)配置類 @ConditionalOnXXX //在指定條件成立的情況下自動(dòng)配置類生效 @AutoConfigureOrder //指定自動(dòng)配置類的順序 @AutoConfigureBefore //在特定自動(dòng)裝配Class之前 @AutoConfigureAfter //在特定自動(dòng)裝配Class之后 @Bean //給容器中添加組件 @ConfigurationPropertie //結(jié)合相關(guān)xxxProperties類來綁定相關(guān)的配置 @EnableConfigurationProperties //讓xxxProperties生效加入到容器中 自動(dòng)配置類要能加載 將需要啟動(dòng)就加載的自動(dòng)配置類,配置在META‐INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ @Conditional:按照一定的條件進(jìn)行判斷,滿足條件給容器注冊(cè)bean @ConditionalOnMissingBean:給定的在bean不存在時(shí),則實(shí)例化當(dāng)前Bean @ConditionalOnProperty:配置文件中滿足定義的屬性則創(chuàng)建bean,否則不創(chuàng)建 @ConditionalOnBean:給定的在bean存在時(shí),則實(shí)例化當(dāng)前Bean @ConditionalOnClass: 當(dāng)給定的類名在類路徑上存在,則實(shí)例化當(dāng)前Bean @ConditionalOnMissingClass :當(dāng)給定的類名在類路徑上不存在,則實(shí)例化當(dāng)前Bean
自定義Starter示例
1、創(chuàng)建自定義的 Starter 工程
創(chuàng)建一個(gè) Spring Boot 工程,將其命名為demo-spring-boot-starter
2、引入依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.14</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
3、定義一個(gè)配置元數(shù)據(jù)類
自定義一個(gè)配置元數(shù)據(jù)類DemoProperties
,用于映射YAML中的配置,使用@ConfigurationProperties
注解需要指定配置項(xiàng)的前綴,此處的前綴為mysyu
。yml文件中提示時(shí)可以使用:mysyu.name
。
包名可以命名為cn.xx.autoconfigure
/** * @ConfigurationProperties:將該類中所有的屬性和配置文件中的相關(guān)配置進(jìn)行綁定。 */ @Component @ConfigurationProperties(prefix = "mystu") @Getter @Setter public class DemoProperties { /** * 屬性 */ private String name; private String sex; private String age; }
4、創(chuàng)建本項(xiàng)目具體實(shí)現(xiàn)類
/** * 這里是寫 這個(gè)項(xiàng)目獲取到了配置之后具體要做什么 * 這個(gè)例子只是簡(jiǎn)單演示starter基本使用 只是輸出 * 比如配置的是發(fā)送短信,那么這里獲取到手機(jī)號(hào)參數(shù)后 可以實(shí)現(xiàn)發(fā)送功能代碼 */ public class DemoService { private DemoProperties demoProperties; public DemoService(DemoProperties demoProperties){ this.demoProperties = demoProperties; } public void print(){ System.out.println("獲取到的姓名:"+demoProperties.getName()); System.out.println("獲取到的性別:"+demoProperties.getSex()); System.out.println("獲取到的年齡:"+demoProperties.getAge()); } }
5、創(chuàng)建一個(gè)配置類
DemoAutoConfiguration
,可以放在和元數(shù)據(jù)類一個(gè)包下
// 該類為一個(gè)配置類 @Configuration(proxyBeanMethods = false) // @ConditionalOnClass是Spring Boot中的一個(gè)條件注解,它用于指定某個(gè)類存在時(shí),才會(huì)創(chuàng)建并初始化被注解的Bean。 // 放在這里就是容器中有DemoService組件 才會(huì)創(chuàng)建DemoAutoConfigure @ConditionalOnClass(value = {DemoService.class}) // 導(dǎo)入我們自定義的配置類,供當(dāng)前類使用 @EnableConfigurationProperties(value = DemoProperties.class) public class DemoAutoConfigure { @Bean // 容器中不存在這個(gè)對(duì)象,才會(huì)實(shí)例化一個(gè)Bean @ConditionalOnMissingBean(DemoService.class) public DemoService helloService(DemoProperties demo) { //把獲取的信息注入 DemoService demoService = new DemoService(demo); return demoService; } }
@Configuration(proxyBeanMethods = false)
首先引出兩個(gè)概念:Full 全模式,Lite 輕量級(jí)模式
- Full(proxyBeanMethods = true) :proxyBeanMethods參數(shù)設(shè)置為true時(shí)即為:Full 全模式。 該模式下注入容器中的同一個(gè)組件無論被取出多少次都是同一個(gè)bean實(shí)例,即單實(shí)例對(duì)象,在該模式下SpringBoot每次啟動(dòng)都會(huì)判斷檢查容器中是否存在該組件
- Lite(proxyBeanMethods = false) :proxyBeanMethods參數(shù)設(shè)置為false時(shí)即為:Lite 輕量級(jí)模式。該模式下注入容器中的同一個(gè)組件無論被取出多少次都是不同的bean實(shí)例,即多實(shí)例對(duì)象,在該模式下SpringBoot每次啟動(dòng)會(huì)跳過檢查容器中是否存在該組件
- 什么時(shí)候用Full全模式,什么時(shí)候用Lite輕量級(jí)模式?當(dāng)在你的同一個(gè)Configuration配置類中,注入到容器中的bean實(shí)例之間有依賴關(guān)系時(shí),建議使用Full全模式當(dāng)在你的同一個(gè)Configuration配置類中,注入到容器中的bean實(shí)例之間沒有依賴關(guān)系時(shí),建議使用Lite輕量級(jí)模式,以提高springboot的啟動(dòng)速度和性能
6、定義自動(dòng)配置的候選
在resources
資源目錄中增加文件META-INF/spring.factories
,并將自定義的配置類DemoAutoConfiguration
加入到自動(dòng)配置類列表中,如下代碼:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ cn.xx.autoconfigure.DemoAutoConfigure
把自動(dòng)配置類DemoAutoConfiguration配置到org.springframework.boot.autoconfigure.EnableAutoConfiguration的key下,springboot會(huì)自動(dòng)加載該文件并根據(jù)條件裝配
Spring Boot 會(huì)檢查所有發(fā)布的jar中是否包含META-INF/spring.factories文件,并將該文件中目標(biāo)類注入IOC容器中,自動(dòng)配置類就是使用這種方式加載的。
7、測(cè)試
以上步驟都完成后 使用maven命令打包
mvn clean install -Dmaven.test.skip=true
或者通過IDEA 的install打包
最后在需要導(dǎo)入該項(xiàng)目的地方引入這個(gè)項(xiàng)目依賴并測(cè)試
到此這篇關(guān)于springboot starter介紹與自定義starter示例的文章就介紹到這了,更多相關(guān)springboot 自定義starter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+WebSocket實(shí)現(xiàn)IM及時(shí)通訊的代碼示例
項(xiàng)目中碰到需要及時(shí)通訊的場(chǎng)景,使用springboot集成websocket,即可實(shí)現(xiàn)簡(jiǎn)單的及時(shí)通訊,本文介紹springboot如何集成websocket、IM及時(shí)通訊需要哪些模塊、開發(fā)和部署過程中遇到的問題、以及實(shí)現(xiàn)小型IM及時(shí)通訊的代碼,需要的朋友可以參考下2023-10-10Springboot初始化項(xiàng)目并完成登入注冊(cè)的全過程
工作之余,想要學(xué)習(xí)一下SpringBoot,通過網(wǎng)絡(luò)大量教程最終成功運(yùn)行SpringBoot項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于Springboot初始化項(xiàng)目并完成登入注冊(cè)的相關(guān)資料,需要的朋友可以參考下2022-10-10Java并發(fā)編程中的CyclicBarrier線程屏障詳解
這篇文章主要介紹了Java并發(fā)編程中的CyclicBarrier線程屏障詳解,2023-12-12java中 String和StringBuffer的區(qū)別實(shí)例詳解
這篇文章主要介紹了java中 String和StringBuffer的區(qū)別實(shí)例詳解的相關(guān)資料,一個(gè)小的例子,來測(cè)試String和StringBuffer在時(shí)間和空間使用上的差別,需要的朋友可以參考下2017-04-04SpringBoot ThreadLocal實(shí)現(xiàn)公共字段自動(dòng)填充案例講解
每一次在Controller層中封裝改動(dòng)數(shù)據(jù)的方法時(shí)都要重新設(shè)置一些共性字段,顯得十分冗余。為了解決此問題也是在項(xiàng)目中第一次利用到線程,總的來說還是讓我眼前一亮,也開闊了視野,對(duì)以后的開發(fā)具有深遠(yuǎn)的意義2022-10-10java固定大小隊(duì)列的幾種實(shí)現(xiàn)方式詳解
隊(duì)列的特點(diǎn)是節(jié)點(diǎn)的排隊(duì)次序和出隊(duì)次序按入隊(duì)時(shí)間先后確定,即先入隊(duì)者先出隊(duì),后入隊(duì)者后出隊(duì),這篇文章主要給大家介紹了關(guān)于java固定大小隊(duì)列的幾種實(shí)現(xiàn)方式,需要的朋友可以參考下2021-07-07Spring項(xiàng)目中使用Junit單元測(cè)試并配置數(shù)據(jù)源的操作
這篇文章主要介紹了Spring項(xiàng)目中使用Junit單元測(cè)試并配置數(shù)據(jù)源的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09