SpringBoot 自定义starter 与自动配置

SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目。除了官方已有的starter,用户自己也可以根据规则自定义自己的starter项目。

本文以自定义一个简单的请求锁为例子,时间有限,简单说下如何自定义一个starter。

一、命名

SpringBoot的官方项目命名方式为spring-boot-starter-xxx 如 spring-boot-starter-quartz。第三方项目的命名方式一般为 xxx- spring-boot-starter。

二 、项目结构

项目一般包含三个模块:核心代码、自动配置、以及Starter。
本次项目的结构如下(公司命名上,将SpringBoot 连接成一个词使用,所以项目名称是base-reqlock-springboot-starter 而不是base-reqlock-spring-boot-starter):

在这里插入图片描述

三、创建项目

安装上面的项目结构创建项目

根据需求,请求锁使用AOP的方式实现,所以在core模块引入依赖

		 <dependency>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
            <version>${guava.version}</version>
        </dependency>
        <dependency>
            <artifactId>spring-boot-starter-aop</artifactId>
            <groupId>org.springframework.boot</groupId>
        </dependency>
        <dependency>
            <artifactId>spring-boot-starter-web</artifactId>
            <groupId>org.springframework.boot</groupId>
        </dependency>
        <dependency>
            <artifactId>lombok</artifactId>
            <groupId>org.projectlombok</groupId>
            <version>${lombok.version}</version>
        </dependency>

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

在autoconfigure模块中引入依赖

		<dependency>
            <artifactId>base-reqlock-core</artifactId>
            <groupId>com.jjsj</groupId>
            <version>${base.version}</version>
        </dependency>

在starter模块中引入依赖

		<dependency>
            <artifactId>base-reqlock-springboot-autoconfigure</artifactId>
            <groupId>com.jjsj</groupId>
            <version>${base.version}</version>
        </dependency>

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

项目本身为Spring项目,其他必须的依赖不做展示

四、编写业务代码

根据业务需求在core模块中编写具体的业务代码,由于涉及到公司业务,所以不展示详细代码,只展示其中的properties对象文件。


package com.jjsj.lock.properties;

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

/**
 * <p>请求锁配置项配置类</p>
 *
 * @author KeplerY
 * @version 2020/2/13
 */
@Data
@ConfigurationProperties(prefix = "base.lock")
public class LockProperties {

    /**
     * 请求idHeader
     */
    private String requestIdHeader = "X-Request-Id";

    /**
     * 请求限制次数
     */
    private int requestLimit = 1;

    /**
     * 默认token头
     * 用于获取token
     * 如果重新实现获取token的实现类,则该参数无效
     */
    private String tokenHeader = "Authorization";
}

其中注解@ConfigurationProperties(prefix = “base.lock”) 的具体用法参照官方文档。

五、编写自动配置类

在autoconfigurate模块中,编写自动配置类

package com.jjsj.lock.config;

import com.jjsj.lock.filter.XRequestIDFilter;
import com.jjsj.lock.properties.LockProperties;
import com.jjsj.lock.service.ILockCacheService;
import com.jjsj.lock.service.ILockControlService;
import com.jjsj.lock.service.ILockCurrentService;
import com.jjsj.lock.service.impl.LockCacheServiceImpl;
import com.jjsj.lock.service.impl.LockControlServiceImpl;
import com.jjsj.lock.service.impl.LockCurrentServiceImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * <p>请求锁自动配置类</p>
 *
 * @author KeplerY
 * @version 2020/2/13
 */
@Configuration
@EnableConfigurationProperties(LockProperties.class)
public class LockAutoConfiguration {

    private final LockProperties lockProperties;

    public LockAutoConfiguration(
        LockProperties lockProperties) {
        this.lockProperties = lockProperties;
    }

    @Bean
    public FilterRegistrationBean xRequestIdFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new XRequestIDFilter());
        registration.addUrlPatterns("/*");
        registration.setName("XRequestIDFilter");
        registration.addInitParameter("requestId", lockProperties.getRequestIdHeader());
        return registration;
    }

    @Bean
    @ConditionalOnMissingBean
    public ILockControlService lockControlService() {
        return new LockControlServiceImpl();
    }

    @Bean
    @ConditionalOnMissingBean
    public ILockCacheService lockCacheService() {
        return new LockCacheServiceImpl();
    }
}

此处的重点在于@EnableConfigurationProperties(LockProperties.class)
引入了proterties配置类并启用。

六、starter

starter 没有JAVA代码,只有一个factories文件,告诉Springboot autoconfig 从哪里加载自动配置
目录结构如下:
在这里插入图片描述
内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.jjsj.lock.config.LockAutoConfiguration

至此一个starter定义完成。


版权声明:本文为qq1107533660原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。