spring-boot - 編寫自己的starter

這是誰的部落格?發表於2020-11-11

世界上並沒有完美的程式,但是我們並不因此而沮喪,因為寫程式就是一個不斷追求完美的過程。

首先注意一下spring-boot-starter的命名規則,
一般spring-boot內部自帶的starter命名格式為:

spring-boot-starter-*

而自定義的spring-boot的starter命名規則為:

*-spring-boot-starter

編寫自己starter的過程如下
1.建立一個空的maven專案

<?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>my-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>    

2.指定Java版本

<properties>
        <java.version>1.8</java.version>
</properties>

3.引入spring-boot依賴版本管理

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

4.引入自定義starter需要的依賴

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>

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

5.開發AutoConfig類

@Configuration
public class MyAutoConfig {
}

6.在配置檔案/resources/META-INF/spring.factories中指定AutoConfig類

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.hou.config.MyAutoConfig

7.編寫配置類實體

@ConfigurationProperties(prefix = "my.com")
public class MyConfigEntity {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

8.在AutoConfig類中引入配置類實體

@Configuration
@EnableConfigurationProperties(MyConfigEntity.class)
public class MyAutoConfig {
}

9.編寫Bean實體

public class MyBean {

    private String name;
    private String age;

    public MyBean () {}
    public MyBean (String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName () {
        return name;
    }

    public String getAge () {
        return age;
    }
}

10.在AutoConfig類中將Bean實體配置為Bean

@Configuration
@EnableConfigurationProperties(MyConfigEntity.class)
public class MyAutoConfig {

    @Bean
    public MyBean myBean (MyConfigEntity myConfigEntity) {

        String name = myConfigEntity.getName();
        String age = myConfigEntity.getAge();
        return new MyBean(name, age);
    }
}

通過以上過程,一個基本的starter就編寫完成了,如果將他引入到其他spring-boot專案中就可以使用了

<dependency>
	<groupId>org.example</groupId>
	<artifactId>my-spring-boot-starter</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>

這是使用時spring-boot專案application.yml的配置

my:
  com:
    name: houbw
    age: 18

這是執行示例

@SpringBootTest
class UserStarterApplicationTests {

	@Autowired
	MyBean myBean;

	@Test
	void contextLoads() {

		String name = myBean.getName();
		String age = myBean.getAge();
		assert "houbw".equals(name);
		assert "18".equals(age);
	}

}

結果執行通過

通過以上過程,可以推斷出,spring-boot專案在執行SpringApplication.run(UserStarterApplication.class, args);啟動時,首先會根據META-INF/spring.factories中EnableAutoConfiguration指定的配置類載入需要的配置資訊及初始化自定義的Bean,在啟動完成後,我們就可以通過自動注入的形式來獲取Bean例項並使用,並且能夠獲取到事先配置好的資料。

關注公眾號
在這裡插入圖片描述

相關文章