SpringBoot系列--自動裝配原理2

Kuroko發表於2021-04-17

前言:SpringBoot功能強大的地方在於將常用的場景抽取成了一個個場景啟動器start,通過這些場景啟動器,再加上我們定製化的配置,便可以使用相關的功能。但是有些情況下,這些場景啟動器無法滿足我們的需求,需要自定義場景啟動器。

我們先看下SpringBoot幫我們封裝的場景啟動器

SpringBoot系列--自動裝配原理2
可以看出,在mybatis-spring-boot-starter這個場景啟動器中,並沒有程式碼

SpringBoot系列--自動裝配原理2

在他的pom檔案中我們找到它其實是依賴了一個mybatis-spring-boot-autoconfigure

SpringBoot系列--自動裝配原理2

在這個mybatis-spring-boot-autoconfigure中我們看到了mybatis相關的功能程式碼

所以我們得出結論:

  • 啟動器(starter)是一個空的jar檔案,僅僅提供輔助性依賴管理,這些依賴可能用於自動裝配或其他類庫。
  • 需要專門寫一個類似spring-boot-autoconfigure的配置模組
  • 用的時候只需要引入啟動器starter,就可以使用自動配置了

如何自定義SpringBootStart

自定義Start步驟流程

1、建立一個父maven專案

專案名:springboot-customer-start

SpringBoot系列--自動裝配原理2
maven配置

SpringBoot系列--自動裝配原理2

1、kuroko-spring-boot-starter配置

<?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">
    <parent>
        <artifactId>springboot_custome_starter</artifactId>
        <groupId>com.kuroko.springboot</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <description>
        啟動器(starter)是一個空的jar檔案,
        僅僅提供輔助性依賴管理,
        這些依賴需要自動裝配或其他類庫。
    </description>

    <artifactId>kuroko-spring-boot-starter</artifactId>

    <dependencies>
        <!--引入autoconfigure-->
        <dependency>
            <groupId>com.kuroko.springboot</groupId>
            <artifactId>kuroko-spring-boot-autoconfigure</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--如果當前starter 還需要其他的類庫就在這裡引用-->
    </dependencies>

</project>

2、kuroko-spring-boot-autoconfigure配置

<?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">
    <parent>
        <artifactId>springboot_custome_starter</artifactId>
        <groupId>com.kuroko.springboot</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>kuroko-spring-boot-autoconfigure</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--‐匯入配置檔案處理器,配置檔案進行繫結就會有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.0</version>
            <optional>true</optional>
        </dependency>

    </dependencies>
</project>

3、HelloAutoConfitguration

/***
 * 給web應用自動新增一個首頁
 */
@Configuration
@ConditionalOnProperty(value = "kuroko.hello.name")
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(StrUtil.class)
public class HelloAutoConfitguration {

    @Autowired
    HelloProperties helloProperties;

    @Bean
    public IndexController indexController(){
        return new IndexController(helloProperties);
    }
}

4、HelloProperties


@ConfigurationProperties("kuroko.hello")
public class HelloProperties {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

5、IndexController

@RestController
public class IndexController {

    HelloProperties helloProperties;

    public IndexController(HelloProperties helloProperties) {
        this.helloProperties=helloProperties;
    }

    @RequestMapping("/")
    public String index(){
        return helloProperties.getName()+"歡迎您";
    }

}

6、spring.factories
在 resources 下建立資料夾 META-INF 並在 META-INF 下建立檔案 spring.factories ,內容如下:

SpringBoot系列--自動裝配原理2

SpringBoot系列--自動裝配原理2

將配置好的kuroko-spring-boot-starter、kuroko-spring-boot-autoconfigure安裝成本地jar包

SpringBoot系列--自動裝配原理2

建立測試類test-springboot-start

SpringBoot系列--自動裝配原理2

引入自定義啟動類:kuroko-spring-boot-starter

SpringBoot系列--自動裝配原理2
配置配置檔案
完成!!!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章