案例講解SpringBoot?Starter的使用教程
一、Starter的簡介
1.什么是SpringBoot Starter
SpringBoot中的starter是一種非常重要的機制(自動化配置),能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進starter,應(yīng)用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應(yīng)的默認配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾。
SpringBoot會自動通過classpath路徑下的類發(fā)現(xiàn)需要的Bean,并注冊進IOC容器。SpringBoot提供了針對日常企業(yè)應(yīng)用研發(fā)各種場景的spring-boot-starter依賴模塊。
所有這些依賴模塊都遵循著約定成俗的默認配置,并允許我們調(diào)整這些配置,即遵循“約定大于配置”的理念。
2.怎么使用SpringBoot Starter
在我們的日常開發(fā)工作中,經(jīng)常會有一些獨立于業(yè)務(wù)之外的配置模塊,我們經(jīng)常將其放到一個特定的包下,然后如果另一個工程需要復(fù)用這塊功能的時候,需要將代碼硬拷貝到另一個工程,重新集成一遍,麻煩至極。如果我們將這些可獨立于業(yè)務(wù)代碼之外的功能配置模塊封裝成一個個starter,復(fù)用的時候只需要將其在pom中引用依賴即可, SpringBoot為我們完成自動裝配,簡直不要太爽。
3.應(yīng)用場景
在我們的日常開發(fā)工作中,可能會需要開發(fā)一個通用模塊,以供其它工程復(fù)用。SpringBoot就為我們提供這樣的功能機制,我們可以把我們的通用模塊封裝成一個個starter,這樣其它工程復(fù)用的時候只需要在pom中引用依賴即可,由SpringBoot為我們完成自動裝配。
常見應(yīng)用場景如下:
1)通用模塊-短信發(fā)送模塊
2)基于AOP技術(shù)實現(xiàn)日志切面
3)分布式雪花ID,Long轉(zhuǎn)String,解決精度問題
4)微服務(wù)項目的數(shù)據(jù)庫連接池配置
5)微服務(wù)項目的每個模塊都要訪問redis數(shù)據(jù)庫,每個模塊都要配置redisTemplate
4.自動加載核心注解說明
二、案例講解
下面我用案例的方式教會大家如何使用starter啟動器。
1.短信發(fā)送模塊
1.1.搭建SpringBoot環(huán)境
首先我們搭建一個SpringBoot項目,需要注意的是以下圖片內(nèi)容,有關(guān)后期導(dǎo)入依賴
導(dǎo)入一個注解處理器,用于處理 Spring Boot 配置類的注解,并生成配置屬性的元數(shù)據(jù)。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
開發(fā)過程中起到以下幾個重要的作用:
- 生成配置屬性的元數(shù)據(jù): 當(dāng)你使用 @ConfigurationProperties 注解來聲明配置類時,spring-boot-configuration-processor 會解析該注解,并生成與配置屬性相關(guān)的元數(shù)據(jù)。這些元數(shù)據(jù)包括屬性的名稱、類型、描述、默認值等信息。這些信息可以幫助 IDE 在開發(fā)過程中提供代碼提示、自動補全和驗證功能。
- 提供配置屬性的編譯時驗證: 使用 @ConfigurationProperties 注解時,你可以使用其他注解(如 @Value、@Valid 等)來描述配置屬性的約束條件。spring-boot-configuration-processor 可以處理這些注解,并在編譯時進行驗證。這樣,你可以在開發(fā)階段及早發(fā)現(xiàn)配置屬性的錯誤或不一致,而不是在運行時才遇到問題。
- 簡化配置類的編寫: 通過使用 spring-boot-configuration-processor,你可以更輕松地編寫配置類。它會自動處理 @ConfigurationProperties 注解及其相關(guān)注解,生成屬性的 getter、setter 方法,并提供默認的配置文件映射規(guī)則。這樣,你可以專注于定義配置屬性的結(jié)構(gòu)和業(yè)務(wù)邏輯,而不需要手動編寫重復(fù)的代碼。
- 提升開發(fā)體驗: spring-boot-configuration-processor 增強了開發(fā)工具的功能,例如在 IDE 中提供配置屬性的智能提示、文檔、類型檢查等功能。這可以減少開發(fā)過程中的錯誤,并提高代碼的可讀性和可維護性。
在這之前需要知道以下我們啟動器與springboot官方提供的依賴有什么關(guān)系
SpringBoot官方命名方式:
spring-boot-starter-{模塊名}
例如:spring-boot-starter-web
自定義命名方式:
{模塊名}-spring-boot-starter
例如:mystarter-spring-boot-starter
1.2.創(chuàng)建配置類Properties
/** * 短信服務(wù)配置類 */ @Data @ConfigurationProperties(prefix = "sms") public class SmsProperties { private String key;//訪問ID、即帳號 private String secret;//訪問憑證,即密鑰 private String enabled;//用于操作是否啟用該模塊 }
提供該配置類的set\get方法并且將配置文件中以sms
為前綴的屬性值綁定到該類對應(yīng)的屬性上。
1.3.編寫短信業(yè)務(wù)功能
ISmsService代碼
public interface ISmsService { /** * 發(fā)送短信 * * @param phone 要發(fā)送的手機號 * @param data 要發(fā)送的內(nèi)容 */ void send(String phone, String data); }
SmsServiceImpl代碼
public class SmsServiceImpl implements ISmsService { private SmsProperties smsProperties ; public SmsServiceImpl(SmsProperties smsProperties) { this.smsProperties=smsProperties; } @Override public void send(String phone, String data) { String key = smsProperties.getKey(); String secret = smsProperties.getSecret(); System.out.println("接入短信系統(tǒng),Key=" + key + ",Secret=" + secret); System.out.println("短信發(fā)送,phone=" + phone + "data=" + data); } }
1.4.創(chuàng)建自動配置類
@Configuration @EnableConfigurationProperties({SmsProperties.class}) @ConditionalOnProperty(prefix = "sms",name = "enable",havingValue = "true") public class SmsConfig { @Autowired private SmsProperties smsProperties; //通過@Bean注解將其注入到Spring上下文中 @Bean public ISmsService smsService(){ //調(diào)用SMS短信服務(wù)接口時,必須通過賬號和密碼的方式進行調(diào)用。 return new SmsServiceImpl(smsProperties); } }
該類的作用是將這個類交與spring管理的同時也把SmsProperties這個類交給spring管理,并且將這個配置類放入spring容器讓其他類可以獲取到,這里還有個條件就是如果我sms.enable的值不為true,那么就都不會加入到spring中。
注釋小課堂:
@Configuration注解:用于定義該類是一個配置類,相當(dāng)于傳統(tǒng)Spring XML配置文件中的<beans>標簽,表示其中包含有一個或多個@Bean注解的方法,用于構(gòu)建bean對象并放入Spring容器中管理。
@EnableConfigurationProperties({SmsProperties.class})注解:用于啟用指定類型的配置屬性(Configuration Properties)。在這里,它啟用了SmsProperties類作為配置屬性類,使得可以在SmsConfig類中通過@Autowired注解自動注入SmsProperties對象。
@Bean注解:用于定義一個bean,并將其注入到Spring上下文中。在這個例子中,smsService方法返回的SmsServiceImpl對象會被納入到Spring容器的管理范圍內(nèi)。
@ConditionalOnProperty(prefix = "sms", name = "enable", havingValue = "true")注解的作用是根據(jù)配置文件中的屬性值來條件性地加載或禁用Bean。
具體而言,它基于以下三個條件進行判斷:
prefix:指定屬性的前綴,即在配置文件中以什么前綴開始的屬性。
name:指定屬性的名稱,即需要判斷的屬性的具體名稱。
havingValue:指定屬性的期望值,當(dāng)該屬性的值與havingValue指定的值相等時,才滿足條件。
1.5.測試代碼
我們在application.properties配置一下SmsProperties
sms: sms.key=j7fj8eoji92d sms.secret=8u8u8u
在測試類調(diào)用一下SmsServiceImpl的send方法
@SpringBootTest class SmsApplicationTests { @Autowired private SmsProperties smsProperties ; @Test void contextLoads() { new SmsServiceImpl(smsProperties).send("110", "愛你"); } }
控制臺輸出結(jié)果
因為我們的自動裝配類,啟動的spring就會將本身以及配置類注入到spring中,而配置類又與配置文件也就是application.properties做了匹配,只要配置文件中填了sms.key和sms.secret就會將填寫的內(nèi)容注入到配置類中。
1.6.其他模塊導(dǎo)入短信模塊
①首先需要編寫spring.factories文件加載自動配置類
在resources下新建META-INF文件夾,然后創(chuàng)建spring.factories文件;
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.csdn.sms.Properties.SmsConfig
②打包安裝
直接install即可
在本地倉庫就會有你剛剛所打包的依賴
注意:打包的時候請注釋application.properties,否則這里的配置就定死了,不會隨著我們調(diào)用者的配置而改動?。。?/strong>
③引用并測試
引入依賴
<dependency> <groupId>com.csdn</groupId> <artifactId>sms</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
配置application.yml
如果enable不為true,那么就不會注入javabean就會報錯
測試模塊功能
@SpringBootTest class BootApplicationTests { @Autowired private SmsProperties smsProperties; @Test void contextLoads() { new SmsServiceImpl(smsProperties).send("15574117565","其他模塊"); } }
看到這里我們的starter的短信模塊就完成了
2.基于AOP技術(shù)的Log日志模塊
我現(xiàn)有一個基于AOP的Log日志功能,這個切面定義了一個切入點webLog(),它匹配所有以Controller結(jié)尾的類的所有方法。在這些方法執(zhí)行之前和之后,分別執(zhí)行了doBefore()和doAfterReturning()方法,這兩個方法中包含了對請求信息的記錄和處理。
@Component @Slf4j @Aspect public class WebLogAspect { @Pointcut("execution(public * com.zking..controller.*.*(..))") @Pointcut("execution(* *..*Controller.*(..))") public void webLog(){} @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { // 接收到請求,記錄請求內(nèi)容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 記錄下請求內(nèi)容 log.info("開始服務(wù):{}", request.getRequestURL().toString()); log.info("客戶端IP :{}" , request.getRemoteAddr()); log.info("參數(shù)值 :{}", Arrays.toString(joinPoint.getArgs())); } @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { // 處理完請求,返回內(nèi)容 log.info("返回值 : {}" , ret); } }
我現(xiàn)在要用剛剛的短信發(fā)送模塊中的方式,通過yml配置enable的屬性來控制是否開啟日志模塊
2.1.創(chuàng)建配置類Properties
@Data @ConfigurationProperties(prefix = "weblog") public class WebLogProperties { private String enable;//控制是否開啟切面 }
2.2.編寫自動配置類
@Configuration @EnableConfigurationProperties({WebLogProperties.class}) @ConditionalOnProperty(prefix = "weblog", value="enable",havingValue = "true") public class WebLogAutoConfig { @Bean @ConditionalOnMissingBean public WebLogAspect webLogAspect(){ return new WebLogAspect(); } }
或者直接在切面類上加上注解
@ConditionalOnProperty(prefix = "weblog", value="enable",havingValue = "true")
當(dāng)我們配置weblog.enable等于true的時候才會開啟Log日志管理,下面演示一下
到此這篇關(guān)于案例講解SpringBoot Starter的使用教程的文章就介紹到這了,更多相關(guān)SpringBoot Starter使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JFinal使用ajaxfileupload實現(xiàn)圖片上傳及預(yù)覽
這篇文章主要為大家詳細介紹了JFinal使用ajaxfileupload實現(xiàn)圖片上傳及預(yù)覽,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09Struts2學(xué)習(xí)筆記(6)-簡單的數(shù)據(jù)校驗
這篇文章主要介紹Struts2中的數(shù)據(jù)校驗,通過一個簡單的例子來說明,希望能給大家做一個參考。2016-06-06老生常談Java網(wǎng)絡(luò)編程TCP通信(必看篇)
下面小編就為大家?guī)硪黄仙U凧ava網(wǎng)絡(luò)編程TCP通信(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Spring Security基本架構(gòu)與初始化操作流程詳解
這篇文章主要介紹了Spring Security基本架構(gòu)與初始化操作流程,Spring Security是一個能夠為基于Spring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架2023-03-03