最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自定義starter方式

 更新時間:2025年02月18日 11:00:26   作者:Exill  
本文介紹了如何創(chuàng)建一個自定義的Spring Boot Starter,以實(shí)現(xiàn)日志功能,通過使用SPI機(jī)制,可以在不修改啟動類的情況下,實(shí)現(xiàn)自動配置和功能導(dǎo)入,同時,還討論了如何在自定義Starter中編寫必要的配置文件和注解,以確保功能的正確實(shí)現(xiàn)和配置的智能提示

命名

推薦以xxx-spring-boot-starter命名

原理

引入spring-boot-starter-jdbc后可直接使用DataSource

1.加載自動配置類

通過SPI(Service Provider Interface,Java提供的服務(wù)發(fā)現(xiàn)機(jī)制,用于框架拓展和組件替換)原理

(1)@SpringBootApplication->@EnableAutoConfiguration->@Import

(2)@Import通過AutoConfigurationImportSelector::selectImports方法導(dǎo)入自動配置類

(3)在AutoConfigurationImportSelector::getCandidateConfigurations方法中得知導(dǎo)入的自動配置類在從META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件讀取

(4)其中包含DataSourceAutoConfiguration類

2.通過xxxAutoConfiguration再導(dǎo)入功能所需的bean

(1)

DataSourceAutoConfiguration->@EnableConfigurationProperties(DataSourceProperties.class)

將Properties類生效,讀取application.yml中數(shù)據(jù)(url、username、password...)

(2)

@Import({ DataSourceConfiguration.Hikari.class... }) 

導(dǎo)入各種連接池,根據(jù)條件注解生效不同連接池

自定義starter

示例:@Log的添加日志功能封裝成starter

1.創(chuàng)建標(biāo)準(zhǔn)SpringBoot項(xiàng)目引入所需依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

2.編寫Properties類

@Data
@Component
@ConfigurationProperties("log")
public class LogProperties{
    private Boolean classFullName= true; //日志展示全類名
    private Boolean showUseTime= true; //日志展示方法執(zhí)行時間
}

3.編寫application.yml配置文件

log:
    class-full-name: true #展示全類名
    show-use-time: true #展示方法執(zhí)行時間

4.編寫@Log注解

@Target(METHOD) //該注解只能用于方法上
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Log{}

5.編寫AOP實(shí)現(xiàn)具體功能

@Slf4j
@Aspect
@Component
public class LogAop {
    @Resource
    private LogProperties logProperties;

    @Around("@annotation(com.gok.log.annotation.Log)")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        long beginTime = System.currentTimeMillis();
        Class targetClass = joinPoint.getSignature().getDeclaringType();
        String functionName = joinPoint.getSignature().getName();
        String name = (logProperties.getClassFullName() ? targetClass.getName() : targetClass.getSimpleName()) + "#" + functionName;
        try {
            log.info("{}開始", name);
            Object res = joinPoint.proceed(joinPoint.getArgs());
            log.info("{}結(jié)束", name);
            return res;
        } catch (Throwable t) {
            log.info("{}異常," + t.getMessage(), name);
            throw t;
        } finally {
            if (logProperties.getShowUseTime()) {
                log.info("{}執(zhí)行時間:{}ms", name, System.currentTimeMillis() - beginTime);
            }
        }
    }
}

SpringBoot默認(rèn)只掃描啟動類所在目錄,而Log實(shí)現(xiàn)所在的包不會掃描,有@Component也無效

所以通過原理中的SPI機(jī)制導(dǎo)入

6.刪除LogProperties類和LogAop類的@Component注解

統(tǒng)一在LogAutoConfiguration導(dǎo)入

@Configuration
//引入Properties類
@EnableConfigurationProperties(LogProperties.class)
//引入Aop
@Import(LogAop.class)
public class LogAutoConfiguration  {
}

7.編寫文件

編寫META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件

引入自動配置類com.gok.logstarter.config.LogAutoConfiguration

8.刪除SpringBoot啟動類(main方法所在類)、刪除pom.xml<build>標(biāo)簽

原因:作為starter不需要啟動類

9.補(bǔ)充

(1)自定義starter的application.yml可以刪除,最終生效的是引入starter項(xiàng)目中application.yml

(2)如果希望實(shí)現(xiàn)編寫application.yml文件智能提示,需要在自定義starter的pom.xml添加如下依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java如何實(shí)現(xiàn)多線程的順序執(zhí)行

    java如何實(shí)現(xiàn)多線程的順序執(zhí)行

    多線程是java的一種重要技術(shù),但是多線程的運(yùn)行是沒有絕對的順序的,那么java如何實(shí)現(xiàn)多線程的順序執(zhí)行,下面就一起來了解一下
    2021-05-05
  • 談?wù)凷pring AOP中@Aspect的高級用法示例

    談?wù)凷pring AOP中@Aspect的高級用法示例

    在Spring AOP中目前只有執(zhí)行方法這一個連接點(diǎn),下面這篇文章主要給大家介紹了關(guān)于Spring AOP中@Aspect的高級用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Java并發(fā)框架中的AQS詳細(xì)解析

    Java并發(fā)框架中的AQS詳細(xì)解析

    這篇文章主要介紹了Java并發(fā)框架中的AQS詳細(xì)解析,之前說鎖的升級的時候,說到了自旋鎖會空轉(zhuǎn)幾次嘗試等待獲取資源,其實(shí)這一系列的動作是有一個規(guī)范的這個規(guī)范叫做同步發(fā)生器AbstractQueuedSynchronizer ,簡稱AQS,需要的朋友可以參考下
    2024-01-01
  • Java 8 引入lambda表達(dá)式的原因解析

    Java 8 引入lambda表達(dá)式的原因解析

    這篇文章主要介紹了Java 8 引入lambda表達(dá)式的原因解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • linux下執(zhí)行java程序的sh腳本分享

    linux下執(zhí)行java程序的sh腳本分享

    這篇文章主要介紹了linux下執(zhí)行java程序的sh腳本,僅供參考,但是設(shè)置的時候環(huán)境變量是最重要的,我就是環(huán)境變量一直不對,總是按網(wǎng)上查到的來,不明白怎么回事,才一直出錯,其實(shí)環(huán)境變量就是你要執(zhí)行的java程序所在的位置
    2014-09-09
  • SpringBoot集成jjwt和使用方式

    SpringBoot集成jjwt和使用方式

    本文詳細(xì)介紹了JWT依賴(以jjwt為例)的引入和使用方法,首先,需要在項(xiàng)目中引入jwt依賴,隨后在Spring的啟動類application.yml中進(jìn)行相應(yīng)配置,最后,提供了一份完整的jwt工具類代碼,供讀者直接使用,以上內(nèi)容便是作者的個人經(jīng)驗(yàn)分享,期望能為讀者提供參考并得到支持
    2024-10-10
  • Java實(shí)現(xiàn)List分組的常見方法詳解

    Java實(shí)現(xiàn)List分組的常見方法詳解

    這篇文章主要為大家詳細(xì)介紹了使用Java實(shí)現(xiàn)List分組的幾個常見方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-12-12
  • 詳解Java二叉排序樹

    詳解Java二叉排序樹

    這篇文章主要介紹了Java二叉排序樹,包括二叉排序樹的定義、二叉排序樹的性質(zhì)、二叉排序樹的插入和查找等,感興趣的小伙伴們可以參考一下
    2015-12-12
  • springboot使用shiro-整合redis作為緩存的操作

    springboot使用shiro-整合redis作為緩存的操作

    這篇文章主要介紹了springboot使用shiro-整合redis作為緩存的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot application.yml配置文件使用及說明

    SpringBoot application.yml配置文件使用及說明

    本文詳細(xì)介紹了SpringBoot application.yml 配置文件的使用和配置項(xiàng),包括創(chuàng)建 application.yml 文件、配置數(shù)據(jù)源、數(shù)據(jù)庫、緩存、郵件服務(wù)等,適合希望深入了解SpringBoot配置文件的開發(fā)者閱讀
    2025-12-12

最新評論

金坛市| 康平县| 梨树县| 赤城县| 澄江县| 黎城县| 彰化县| 彰化县| 陆川县| 阳新县| 泗阳县| 东港市| 昭通市| 河北区| 兴山县| 准格尔旗| 桦川县| 桐柏县| 山东| 剑川县| 望江县| 巴塘县| 永和县| 进贤县| 桐梓县| 金秀| 施秉县| 牡丹江市| 图木舒克市| 玉屏| 勃利县| 石河子市| 莒南县| 襄樊市| 定兴县| 中西区| 平顶山市| 巴东县| 聊城市| 富顺县| 华容县|