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定义完成。