编写自己的Spring Boot Starter

基本步骤

  • 引入对应的依赖
  • 编写实现类
  • 编写配置文件读取类,主要注解是@ConfigurationProperties(配置的值例如a.b)
  • 编写自动装配类
  • 编写默认的配置文件resources/META-INF/spring.factories

resources/META-INF/spring.factories中配置我们的自动装配类

具体编码

引入的依赖

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

说明:

  • 第一个依赖 主要是为编译器配置的,可以根据ymlproperties配置项鼠标右键,点到使用这个属性的类上
  • 第二个依赖 主要是为了自动装配

编写自己的功能实现类

为了说明问题 实现类的作用就是返回配置字符串的hashcode

package cn.appblog;

/**
 * 目标功能实现类
 */
public class HashCodeClient {
    private String target;

    public HashCodeClient(String target){
        this.target = target;
    }

    public String getHashCode() {
        return String.valueOf(this.target.hashCode());
    }
}

编写配置文件读取类

package cn.appblog;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("cn.appblog")
public class HashCodeProperties {

    private String target;

    public String getTarget() {
        return target;
    }

    public void setTarget(String target) {
        this.target = target;
    }
}

这里我们要读取的配置就是cn.appblog.target的值,@ConfigurationProperties注解的作用就是读取配置文件指定属性的值

编写自动装配类

package cn.appblog;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(HashCodeProperties.class)
@ConditionalOnClass(HashCodeClient.class)
public class HashCodeAutoConfigrution {

    @Autowired
    private HashCodeProperties hashCodeProperties;

    @ConditionalOnMissingBean
    @Bean
    public HashCodeClient getHashCodeClient(){
        return new HashCodeClient(hashCodeProperties.getTarget());
    }
}

@Configuration

标识本类是配置类(相当于spring中application.xml)

@EnableConfigurationProperties(HashCodeProperties.class)

如果HashCodeProperties中有注解@ConfigurationProperties那么这个类就会被加到spring上下文的容器中,也就是可以通过@Autowire来注入

@ConditionalOnClass

当类路径下有指定类的情况下才进行下一步

@ConditionalOnMissingBean

当spring容器中没有这个Bean时才进行下一步

设置自动加载的配置文件spring.factories

resources/META-INF下添加spring.factories指定自动装配的类也叫入口,内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
  cn.appblog.HashCodeAutoConfigrution

添加我们的默认配置

application.yml中添加下面

cn:
  appblog:
    target: www.appblog.cn

这就有了默认值

发布本地仓库或部署私有仓库

通过maven install命令发布在本地,然后在其他项目引入这个jar依赖,测试时直接自动注入我们的bean即可

测试是否成功

新建Spring Boot工程,引入依赖

<!--引入自定义的starter-->
<dependency>
    <groupId>com.test.springboot</groupId>
    <artifactId>myself-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

直接进行单元测试

package cn.appblog.test;

import cn.appblog.HashCodeClient;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.*;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class ControllerTest {

    @Autowired
    private HashCodeClient hashCodeClient;

    @Test
    public void testStarter(){
        System.out.println(hashCodeClient.getHashCode());
    }
}

运行成功获取hashCode

application.yml中覆盖原来的属性

cn:
  appblog:
    target: test

测试得hashCode不一致,证明成功

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/26/write-spring-boot-starter/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
编写自己的Spring Boot Starter
基本步骤 引入对应的依赖 编写实现类 编写配置文件读取类,主要注解是@ConfigurationProperties(配置的值例如a.b) 编写自动装配类 编写默认的配置文件resourc……
<<上一篇
下一篇>>
文章目录
关闭
目 录