日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

只需 4 步,自己搞个 Spring Boot Starter!

發布時間:2025/3/21 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 只需 4 步,自己搞个 Spring Boot Starter! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

只要你用Springboot,一定會用到各種spring-boot-starter。其實寫一個spring-boot-starter,僅需4步。下面我們就寫一個starter,它將實現,在日志中打印方法執行時間。

推薦一個艿艿寫的 6000+ Star 的 SpringBoot + SpringCloud + Dubbo 教程的倉庫:https://github.com/YunaiV/SpringBoot-Labs

第一步 創建maven項目

在使用spring-boot-starter,會發現,有的項目名稱是 XX-spring-boot-starter,有的是

spring-boot-starter-XX,這個項目的名稱有什么講究呢?

從springboot官方文檔摘錄如下:

Do not start your module names with spring-boot, even if you use a different Maven groupId. We may offer official support for the thing you auto-configure in the future.

As a rule of thumb, you should name a combined module after the starter.

從這段話可以看出spring-boot-starter命名的潛規則。

命名潛規則

spring-boot-starter-XX是springboot官方的starter

XX-spring-boot-starter是第三方擴展的starter

打印方法執行時間的功能,需要用到aop,咱們的項目就叫做

aspectlog-spring-boot-starter吧。

項目的pom文件如下:

<?xml?version="1.0"?encoding="UTF-8"?> <project?xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>aspectlog-spring-boot-starter</artifactId><version>1.0.2</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.15.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency></dependencies></project>

關于spring-boot-configuration-processor的說明,引自springBoot官方文檔:

Spring Boot uses an annotation processor to collect the conditions on auto-configurations in a metadata file ( META-INF/spring-autoconfigure-metadata.properties ). If that file is present, it is used to eagerly filter auto-configurations that do not match, which will improve startup time. It is recommended to add the following dependency in a module that contains auto-configurations:

org.springframework.boot

spring-boot-autoconfigure-processor

true

簡單說就是:寫starter時,在pom中配置spring-boot-autoconfigure-processor,在編譯時會自動收集配置類的條件,寫到一個META-INF/spring-autoconfigure-metadata.properties中。

推薦一個艿艿寫的 3000+ Star 的 SpringCloud Alibaba 電商開源項目的倉庫:https://github.com/YunaiV/onemall

第二步寫自動配置邏輯

各種condition

類型注解說明
Class Conditions類條件注解@ConditionalOnClass當前classpath下有指定類才加載
@ConditionalOnMissingClass當前classpath下無指定類才加載?
Bean ConditionsBean條件注解@ConditionalOnBean當期容器內有指定bean才加載
@ConditionalOnMissingBean當期容器內無指定bean才加載?
Property Conditions環境變量條件注解(含配置文件)@ConditionalOnPropertyprefix 前綴name 名稱havingValue 用于匹配配置項值matchIfMissing 沒找指定配置項時的默認值
ResourceConditions 資源條件注解@ConditionalOnResource有指定資源才加載
Web Application Conditionsweb條件注解@ConditionalOnWebApplication是web才加載
@ConditionalOnNotWebApplication不是web才加載?
SpEL Expression Conditions@ConditionalOnExpression符合SpEL 表達式才加載

本次我們就選用@ConditionalOnProperty。即配置文件中有aspectLog.enable=true,才加載我們的配置類。

下面開始寫自動配置類

2.1.定義AspectLog注解,該注解用于標注需要打印執行時間的方法。

package?com.shanyuan.autoconfiguration.aspectlog; import?java.lang.annotation.ElementType; import?java.lang.annotation.Retention; import?java.lang.annotation.RetentionPolicy; import?java.lang.annotation.Target; /***?class_name:?ScheduleManage*?describe:???用于控制定時任務的開啟與關閉*?對應切面*?creat_user:?wenl*?creat_time:??2018/11/10?18:45**/ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public?@interface???AspectLog?{ }

2.2定義配置文件對應類

package?com.shanyuan.autoconfiguration.aspectlog; import?org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties("aspectLog") public?class?AspectLogProperties?{private?boolean?enable;public?boolean?isEnable()?{return?enable;}public?void?setEnable(boolean?enable)?{this.enable?=?enable;} }

2.3定義自動配置類

package?com.shanyuan.autoconfiguration.aspectlog;import?org.aspectj.lang.ProceedingJoinPoint; import?org.aspectj.lang.annotation.Around; import?org.aspectj.lang.annotation.Aspect; import?org.slf4j.Logger; import?org.slf4j.LoggerFactory; import?org.springframework.boot.autoconfigure.condition.*; import?org.springframework.context.annotation.Configuration; import?org.springframework.context.annotation.EnableAspectJAutoProxy; import?org.springframework.core.PriorityOrdered;@Aspect @EnableAspectJAutoProxy(exposeProxy?=?true,?proxyTargetClass?=?true) @Configuration @ConditionalOnProperty(prefix?=?"aspectLog",?name?=?"enable",havingValue?=?"true",?matchIfMissing?=?true) public?class?AspectLogAutoConfiguration?implements?PriorityOrdered?{protected?Logger?logger?=?LoggerFactory.getLogger(getClass());@Around("@annotation(com.shanyuan.autoconfiguration.aspectlog.AspectLog)?")public?Object?isOpen(ProceedingJoinPoint?thisJoinPoint)throws?Throwable?{//執行方法名稱String?taskName?=?thisJoinPoint.getSignature().toString().substring(thisJoinPoint.getSignature().toString().indexOf("?"),thisJoinPoint.getSignature().toString().indexOf("("));taskName?=?taskName.trim();long?time?=?System.currentTimeMillis();Object?result?=?thisJoinPoint.proceed();logger.info("method:{}?run?:{}?ms",?taskName,(System.currentTimeMillis()?-?time));return?result;}@Overridepublic?int?getOrder()?{//保證事務等切面先執行return?Integer.MAX_VALUE;} }

配置類簡要說明:

@ConditionalOnProperty(prefix?=?"aspectLog",?name?=?"enable",havingValue?=?"true",?matchIfMissing?=?true)

當配置文件有aspectLog.enable=true時開啟,如果配置文件沒有設置aspectLog.enable也開啟。

第三步META-INF/spring.factories

META-INF/spring.factories是spring的工廠機制,在這個文件中定義的類,都會被自動加載。多個配置使用逗號分割,換行用\

如果有興趣可以查看這2篇blog:

2.@Enable驅動原理(設置連接)

3.@EnableAutoConfiguration處理邏輯(設置連接)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.shanyuan.autoconfiguration.aspectlog.AspectLogAutoConfiguration

第四步打包測試

這是我們最終的目錄結構

在IDEA中,進行mvn intall

打包完成后,在其他項目中的pom中引入進行測試

參考資料

  • https://docs.spring.io/spring-boot/docs/2.1.15.RELEASE/reference/html/boot-features-developing-auto-configuration.html#boot-features-custom-starter

總結

以上是生活随笔為你收集整理的只需 4 步,自己搞个 Spring Boot Starter!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。