SpringBoot自定义starter

定义

什么是自动装配?

SpringBoot 在启动时会扫描外部依赖jar 包中的某些文件,将文件中配置的类型信息加载到 Spring 容器。

简单来说,自动装配能够加载三方jar包中的类,注册到Spring容器。

自动装配版本

自SpringBoot 2.7版本开始,对于如何告知SpringBoot要自动装配哪些类发生了变化。

在这之前的SpringBoot版本,需要写一个spring.factories,放到recourses下的META-INF目录。

而从2.7版本开始,需要写一个org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,放在放到recourses/META-INF/spring目录下,如图所示:
在这里插入图片描述

如果自定义starter

说明

首先要清楚:封装成starter意味着需要自动装配某些类,否则它就是一个普通的maven项目,不需要做成starter。

  1. 创建两个模块,starter模块和autoconfig模块。starter模块会引用autoconfig模块,也可以管理一些依赖,并不需要编码。(包一层思想)
  2. 创建一个模块,starter模块和autoconfig模块融合在一起。

第一个种方式的好处是:解耦,如果自动装配项目有好几个,有一些可选的特性(也只是针对这种类似情况),
通过starter将autoconfig包装,就可以在starter中对依赖进行管理:排除或者依赖传递。将starter模块暴露给用户,引入即可用,更加便捷。

编码

我这里采用分两个模块开发starter,一共创建了三个项目:

  1. springboot-starter-demo-autoconfig - starter的配置逻辑实现项目
  2. springboot-starter-demo - 1的封装项目
  3. starter-use-demo - 使用starter的项目

项目一:springboot-starter-demo-autoconfig

项目结构

在这里插入图片描述

POM依赖
<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <autoconfigure.version>2.7.6</autoconfigure.version>
    <autoconfigure.processor.version>2.7.6</autoconfigure.processor.version>
</properties>

<!-- 自动配置 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>${autoconfigure.version}</version>
    <optional>true</optional>
</dependency>

<!-- 配置处理,增加配置提示 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure-processor</artifactId>
    <version>${autoconfigure.processor.version}</version>
    <optional>true</optional>
</dependency>

注意:这里一般需要将自动配置的optional 设置为true 即不产生传递依赖,避免引用的项目依赖冲突

代码
@AutoConfiguration
@ConfigurationProperties(prefix = "test")
public class TestConfig {

    private String name;

    private String hobby;

    public TestConfig() {
    }

    public String getName() {
        return name;
    }

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

    public String getHobby() {
        return hobby;
    }
    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
}

文件1:即为实现SpringBoot自动装配的配置文件:com.xy.example.TestConfig
文件2:实现配置提示的元数据文件,文件2的内容即效果如下:

{
  "properties": [
    {
      "name": "test.name",
      "type": "java.lang.String",
      "description": "姓名"
    },
    {
      "name": "test.hobby",
      "type": "java.lang.String",
      "description": "爱好"
    }
  ]
}

在这里插入图片描述

项目二:springboot-starter-demo

pom文件

引入项目一的依赖

   <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.xy</groupId>
            <artifactId>springboot-starter-demo-autoconfig</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

项目三:starter-use-demo

pom文件 引入项目二的依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

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

        <dependency>
            <groupId>com.xy</groupId>
            <artifactId>springboot-starter-demo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
applicition.properties配置文件:

在这里插入图片描述

测试类
@SpringBootTest
class StarterUseDemoApplicationTests {

    @Autowired
    private TestConfig config;
    @Test
    void contextLoads() {
        System.out.println(config.getName() + "-" + config.getHobby());
    }

}
打印结果

在这里插入图片描述

一个自定义的starter就完成了~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值