欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot自定義starter方式

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

命名

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

原理

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

1.加載自動配置類

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

(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項目引入所需依賴

        <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實現(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實現(xiàn)所在的包不會掃描,有@Component也無效

所以通過原理中的SPI機制導(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.補充

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

(2)如果希望實現(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java微信公眾平臺之自定義菜單

    Java微信公眾平臺之自定義菜單

    這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺之自定義菜單,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Java 創(chuàng)建PDF打印小冊子案例

    Java 創(chuàng)建PDF打印小冊子案例

    這篇文章主要給大家分享Java 創(chuàng)建PDF打印小冊子案例,PDF打印小冊子是指將PDF格式文檔在打印成刊物前需要提前進行的頁面排版,以便在打印后裝訂成冊,下面文章內(nèi)容我們將下面以Java代碼展示如何來實現(xiàn),需要的朋友可以參考一下
    2021-10-10
  • 程序員最喜歡的ThreadLocal使用姿勢

    程序員最喜歡的ThreadLocal使用姿勢

    ThreadLocal并不是一個Thread,而是Thread的局部變量,也許把它命名為ThreadLocalVariable更容易讓人理解一些,下面這篇文章主要給大家介紹了程序員最喜歡的ThreadLocal使用姿勢,需要的朋友可以參考下
    2022-02-02
  • 快速排序算法原理及java遞歸實現(xiàn)

    快速排序算法原理及java遞歸實現(xiàn)

    快速排序 對冒泡排序的一種改進,若初始記錄序列按關(guān)鍵字有序或基本有序,蛻化為冒泡排序。使用的是遞歸原理,在所有同數(shù)量級O(n longn) 的排序方法中,其平均性能最好。就平均時間而言,是目前被認(rèn)為最好的一種內(nèi)部排序方法
    2014-01-01
  • Java線程的全方位詳解

    Java線程的全方位詳解

    Java 給多線程編程提供了內(nèi)置的支持。 一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù),多線程是多任務(wù)的一種特別的形式,但多線程使用了更小的資源開銷
    2021-10-10
  • spring jdbctemplate的用法小結(jié)

    spring jdbctemplate的用法小結(jié)

    jdbcTemplate是spring框架中提供的一個對象,是對原始繁雜的jdbc 對象的簡單封裝,本文通過實例代碼介紹spring jdbctemplate的用法小結(jié),需要的朋友可以參考下
    2023-04-04
  • spring aop 攔截業(yè)務(wù)方法,實現(xiàn)權(quán)限控制示例

    spring aop 攔截業(yè)務(wù)方法,實現(xiàn)權(quán)限控制示例

    這篇文章主要介紹了spring aop 攔截業(yè)務(wù)方法,實現(xiàn)權(quán)限控制示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • 零基礎(chǔ)寫Java知乎爬蟲之獲取知乎編輯推薦內(nèi)容

    零基礎(chǔ)寫Java知乎爬蟲之獲取知乎編輯推薦內(nèi)容

    上篇文章我們拿百度首頁做了個小測試,今天我們來個復(fù)雜的,直接抓取知乎編輯推薦的內(nèi)容,小伙伴們可算松了口氣,終于進入正題了,哈哈。
    2014-11-11
  • java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組

    java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組

    這篇文章主要介紹了java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • SpringBoot actuator 健康檢查不通過的解決方案

    SpringBoot actuator 健康檢查不通過的解決方案

    這篇文章主要介紹了SpringBoot actuator 健康檢查不通過的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論