Spring Boot Starter原理及實現(xiàn)

Spring Boot Starter是在SpringBoot組件中被提出來的一種概念。傳統(tǒng)的 Spring 項目想要運行,需要導入各種依賴和配置,十分繁瑣。而Spring Boot 能簡化配置、開箱即用、快速集成,主要歸功于SpringBoot 的 starter 機制。通過starter,我們能夠快速的引入一個功能組件。本文將對 stater 進行介紹。

1 starter概述

starter會把所有用到的依賴都給包含進來,避免了開發(fā)者自己去引入依賴所帶來的麻煩。
starter中使用ConfigurationProperties來保存配置,這些配置都可以有默認值,幫助用戶減少了無謂的配置操作。同時starter一般會預留自定配置選項,只需要在application.properties中設置相關參數(shù),就可以實現(xiàn)配置的個性話。

這里簡單介紹下starter實現(xiàn)自動化配置的流程。
引入starter依賴后,spring-boot啟動的時候會找到starter jar包中的resources/META-INF/spring.factories文件,根據(jù)spring.factories文件中的配置,找到需要自動配置的類

2 Starter創(chuàng)建和使用步驟

2.1 starter創(chuàng)建

  • 創(chuàng)建一個starter項目

  • 創(chuàng)建一個ConfigurationProperties,用于保存配置信息

  • 創(chuàng)建一個AutoConfiguration(Configuration)
    AutoConfiguration中實現(xiàn)所有starter應該完成的操作;
    AutoConfiguration 并且把這個類加入spring.factories配置文件中進行聲明

  • 配置spring.factories
    把AutoConfiguration類加入spring.factories配置文件中進行聲明。通過該配置,才能SpringBoot來自動加載AutoConfiguration類。

  • 打包項目

2.2 starter使用

在項目里使用starter非常簡單:

  • 引入starter依賴
  • 添加配置(如果需要的話)
  • 注入需要的service

3 實現(xiàn)一個Spring Boot Starter項目

3.1 創(chuàng)建Starter項目

SpringBoot系列定義jar包的名稱是:
spring-boot-starter-xxx.jar
而自己的項目定義的jar通常是:
xxx-spring-boot-starter.jar

這里我們創(chuàng)建一個husky-spring-boot-starter項目,pom主要如下

  <groupId>com.dc.husky</groupId>
    <artifactId>husky-spring-boot-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>

3.2 創(chuàng)建ConfigurationProperties

ConfigurationProperties用于保存配置信息:

@ConfigurationProperties(prefix = "husky")
@Getter
@Setter
public class HuskyProperties {
    private String character;
}

3.3 創(chuàng)建AutoConfiguration

@Configuration
@EnableConfigurationProperties(HuskyProperties.class)
public class HuskyAutoConfiguration {
    @Bean
    public Husky husky(HuskyProperties properties){
        Husky husky = new Husky(properties.getCharacter());
        return husky;
    }
}

HuskyAutoConfiguration 主要的業(yè)務功能定義Husky如下

public class Husky {
    private  String character;
    private String name = "husky";

    public Husky(String character) {
        this.character = character;
    }

    public void tellSecret(){
        if ("lovely".equals(character)){
            System.out.println("Congratulation! You have a lovely husky.");
        } else {
            System.out.println("What a pity! You have a naughty husky.");
        }
    }
}

3.4 配置spring.factories

在resources/META-INF/下創(chuàng)建spring.factories文件,并添加下列配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.dc.husky.starter.HuskyAutoConfiguration

3.4 打包項目,生成jar包

image.png

3.5 使用spring-boot-starter

maven引入husky-spring-boot-starter的jar包

       <dependency>
            <groupId>com.dc.husky</groupId>
            <artifactId>husky-spring-boot-starter</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

在 resources/application.properties文件添加自定義的配置

husky.character=lovely

測試輸出

@SpringBootTest
@Slf4j
class ApplicationTests {   
    @Autowired
    private Husky husky;
    @Test
    void test() {
        husky.tellSecret();
    }
}

輸出結果如下

2022-10-15 19:21:57.115  INFO 90145 --- [main] c.d.a.s.ApplicationTests    : Started ApplicationTests in 4.353 seconds (JVM running for 7.676)
Congratulation! Your have a lovely husky.

4 原理

我們引入starter的依賴,會將自動配置的類的jar引入。主要的邏輯如下:

  • 在SpringBoot的啟動類會加上@SpringBootApplication注解。這個注解默認會引入@EnableAutoConfiguration注解。

  • @EnableAutoConfiguration注解使用@Import引入了AutoConfigurationImportSelector類。

  • AutoConfigurationImportSelector的selectImports方法最終會通過SpringFactoriesLoader.loadFactoryNames加載META-INF/spring.factories文件。

  • spring.factories包含了所有需要裝配的XXXConfiguration類的全限定名。其中就有我們自己定義的HuskyAutoConfiguration。這些configuration類定義的bean根據(jù)配置信息進行初始化,并加入到spring到容器中。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容