Java SpringBoot自定義starter詳解
一、什么是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)整這些配置,即遵循“約定大于配置”的理念。
二、為什么要自定義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.分布式雪花ID,Long-->string,解決精度問題
jackson2/fastjson
4.微服務(wù)項(xiàng)目的數(shù)據(jù)庫(kù)連接池配置
5.微服務(wù)項(xiàng)目的每個(gè)模塊都要訪問redis數(shù)據(jù)庫(kù),每個(gè)模塊都要配置redisTemplate
也可以通過starter解決
自動(dòng)加載核心注解說明
四、自定義starter的開發(fā)流程(案例:為短信發(fā)送功能創(chuàng)建一個(gè)starter)
創(chuàng)建Starter項(xiàng)目
starter項(xiàng)目和SpringBoot工程結(jié)構(gòu)沒有什么區(qū)別
1、細(xì)節(jié):命名規(guī)范
SpringBoot官方命名方式
格式:spring-boot-starter-{模塊名}
舉例:spring-boot-starter-web
自定義命名方式
格式:{模塊名}-spring-boot-starter
舉例:mystarter-spring-boot-starter
由于的這里只做個(gè)案例給大家看,就只需要添加這幾項(xiàng)就好了....
2.必須引入的依賴
<!--表示兩個(gè)項(xiàng)目之間依賴不傳遞;不設(shè)置optional或者optional是false,表示傳遞依賴--> <!--例如:project1依賴a.jar(optional=true),project2依賴project1,則project2不依賴a.jar--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
該依賴在上面像我一樣選擇了的,它會(huì)自動(dòng)生成在pom.xml文件中
3.編寫相關(guān)屬性類(XxxProperties):例如 SmsProperties.java
代碼如下:
package com.zking.smscloudspringbootstarter.sms; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties("smscloud.sms") public class SmsProperties { private String accessKeyId;//訪問ID、即帳號(hào) private String accessKeySecret;//訪問憑證,即密碼 public SmsProperties() { } public String getAccessKeyId() { return accessKeyId; } public void setAccessKeyId(String accessKeyId) { this.accessKeyId = accessKeyId; } public String getAccessKeySecret() { return accessKeySecret; } public void setAccessKeySecret(String accessKeySecret) { this.accessKeySecret = accessKeySecret; } }
@ConfigurationProperties注解基本用法,前綴定義了哪些外部屬性將綁定到類的字段上
根據(jù) Spring Boot 寬松的綁定規(guī)則,類的屬性名稱必須與外部屬性的名稱匹配
我們可以簡(jiǎn)單地用一個(gè)值初始化一個(gè)字段來定義一個(gè)默認(rèn)值
類本身可以是包私有的
類的字段必須有公共 setter 方法
注意:SmsProperties代碼寫完后會(huì)報(bào)如下錯(cuò)誤,這是正常的,因?yàn)?br /> 還有配置類AutoConfig和一個(gè)注解@EnableConfigurationProperties沒有加
Not registered via @EnableConfigurationProperties or marked as Spring component
4.編寫Starter項(xiàng)目的業(yè)務(wù)功能
ISmsService和SmsServiceImpl
package com.zking.smscloudspringbootstarter.sms; public interface ISmsService { /** * 發(fā)送短信 * * @param phone 要發(fā)送的手機(jī)號(hào) * @param signName 短信簽名-在短信控制臺(tái)中找 * @param templateCode 短信模板-在短信控制臺(tái)中找 * @param data 要發(fā)送的內(nèi)容 */ void send(String phone, String signName, String templateCode, String data); } public class SmsServiceImpl implements ISmsService{ private String accessKeyId;//訪問ID、即帳號(hào) private String accessKeySecret;//訪問憑證,即密碼 public SmsServiceImpl(String accessKeyId, String accessKeySecret) { this.accessKeyId = accessKeyId; this.accessKeySecret = accessKeySecret; } @Override public void send(String phone, String signName, String templateCode, String data) { System.out.println("接入短信系統(tǒng),accessKeyId=" + accessKeyId + ",accessKeySecret=" + accessKeySecret); System.out.println("短信發(fā)送,phone=" + phone + ",signName=" + signName + ",templateCode=" + templateCode + ",data=" + data); } }
5.編寫自動(dòng)配置類AutoConfig
1. @Configuration: 定義一個(gè)配置類
2. @EnableConfigurationProperties:注解的作用是@ConfigurationProperties注解生效。
如果只配置@ConfigurationProperties注解,在IOC容器中是獲取不到properties配置文件轉(zhuǎn)化的bean的
代碼如下:
package com.zking.smscloudspringbootstarter.config; import com.zking.smscloudspringbootstarter.sms.SmsProperties; import com.zking.smscloudspringbootstarter.sms.SmsServiceImpl; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; @Configuration //表示該類為配置類 @EnableConfigurationProperties({SmsProperties.class}) public class SmsAutoConfig { @Resource private SmsProperties smsProperties; @Bean public SmsServiceImpl smsServiceImpl(){ return new SmsServiceImpl(smsProperties.getAccessKeyId(),smsProperties.getAccessKeySecret()); } }
6.編寫spring.factories文件加載自動(dòng)配置類
1.在resources下新建META-INF文件夾,然后創(chuàng)建spring.factories文件
2.在該文件中加入如下配置,該配置指定上步驟中定義的配置類為自動(dòng)裝配的配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zking.zzcloudspringbootstarter.config.SmsAutoConfig
注:其中AutoConfig是starter配置文件的類限定名,多個(gè)之間逗號(hào)分割,還可以\進(jìn)行轉(zhuǎn)義即相當(dāng)于去掉后面換行和空格符號(hào)
7.打包安裝
打包時(shí)需要注意一下,SpringBoot項(xiàng)目打包的JAR是可執(zhí)行JAR,它的類放在BOOT-INF目錄下,如果直接作為其他項(xiàng)目的依賴,會(huì)找不到類??梢酝ㄟ^修改pom文件來解決,代碼如下:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin>
然后再進(jìn)行打包
打包成功后就可以再其他項(xiàng)目引用了,我們可以再maven倉(cāng)庫(kù)中看到
我們先查看下自己的maven倉(cāng)庫(kù)放哪了,然后去找到對(duì)應(yīng)的地方
上面就是打包成功的樣子
8.其它項(xiàng)目引用
1.首先在其他項(xiàng)目的pom.xnml中引入依賴
2、在application.yml文件中添加配置
然后我們可以寫一個(gè)測(cè)試類來測(cè)試一下
以上就是案例的一個(gè)流程,可以看到我們是可以在其他項(xiàng)目中可以看到我們想要是功能的
總結(jié)
本文簡(jiǎn)單介紹了下springboot中starter機(jī)制,以及一個(gè)案例的編寫。如有不足,歡迎補(bǔ)充
敖丙說過:你知道的越多,不知道的越多
到此這篇關(guān)于Java SpringBoot自定義starter詳解的文章就介紹到這了,更多相關(guān)Java 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)過程圖解
- springboot自定義redis-starter的實(shí)現(xiàn)
- SpringBoot自動(dòng)配置之自定義starter的實(shí)現(xiàn)代碼
- 使用SpringBoot自定義starter的完整步驟
- SpringBoot如何自定義starter
- SpringBoot自定義start詳細(xì)圖文教程
相關(guān)文章
springboot中request和response的加解密實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot中request和response的加解密實(shí)現(xiàn),在springboot中提供了RequestBodyAdviceAdapter和ResponseBodyAdvice,利用這兩個(gè)工具可以非常方便的對(duì)請(qǐng)求和響應(yīng)進(jìn)行預(yù)處理,需要的朋友可以參考下2022-06-06如何使用try-with-resource機(jī)制關(guān)閉連接
這篇文章主要介紹了使用try-with-resource機(jī)制關(guān)閉連接的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07springboot?web項(xiàng)目中?Set-Cookie?失敗原因及解決辦法
這篇文章主要介紹了springboot?web項(xiàng)目中?Set-Cookie?失敗原因及解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10Spring?Boot中使用Swagger3.0.0版本構(gòu)建RESTful?APIs的方法
Swagger?是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化?RESTful?風(fēng)格的?Web?服務(wù),這篇文章主要介紹了Spring?Boot中使用Swagger3.0.0版本構(gòu)建RESTful?APIs的方法,需要的朋友可以參考下2022-11-11SpringBoot+Mybatis實(shí)現(xiàn)登錄注冊(cè)的示例代碼
這篇文章主要介紹了SpringBoot+Mybatis實(shí)現(xiàn)登錄注冊(cè)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03spring?boot教程之建立第一個(gè)HelloWorld
這篇文章主要介紹了spring?boot教程之建立第一個(gè)HelloWorld的相關(guān)資料,需要的朋友可以參考下2022-08-08Spring Boot2發(fā)布調(diào)用REST服務(wù)實(shí)現(xiàn)方法
這篇文章主要介紹了Spring Boot2發(fā)布調(diào)用REST服務(wù)實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04java網(wǎng)絡(luò)爬蟲連接超時(shí)解決實(shí)例代碼
這篇文章主要介紹了java網(wǎng)絡(luò)爬蟲連接超時(shí)解決的問題,分享了一則使用httpclient解決連接超時(shí)的Java爬蟲實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01