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