spring-boot - 编写自己的starter

143 阅读2分钟

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

首先注意一下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实例并使用,并且能够获取到事先配置好的数据。

关注公众号
在这里插入图片描述