- 一、什么是 Spring Boot Starter ?
- 二、Stater 的命名规范?
- 三、自定义 Spring Boot Starter
- 目标(需求)
- 项目结构
- 1、pom依赖
- 2、功能实现代码
- 3、自动装配配置类
- 4、创建 spring.factories 将要加载的类配置进去
- 打包 Starter 到 maven 仓库
- 四、测试自定义的 Starter
- 1、引入依赖
- 2、配置参数
- 3、调用 Starter 提供的功能
- 五、使 Starter 支持配置参数默认值
Spring Boot 在配置上相比 Spring 要简单许多,其核心就在于 Spring Boot Starter。Spring Boot Starter 可以将模块所需的依赖根据环境自动配置。使用者只需要依赖相应功能的 Starter ,无需过多的配置和依赖,Spring Boot 就能自动扫描并加载相应的模块。
二、Stater 的命名规范?- Spring 官方:spring-boot-starter-{name}
- 自行提供:{name}-spring-boot-starter
实现一个短信发送的模块(本文目的为学习 Starter ,因此只是模拟实现,调用之后打印一行日志)。
项目结构 1、pom依赖2、功能实现代码4.0.0 org.springframework.boot spring-boot-starter-parent 2.6.7 com.aichen.sms.springboot aichen-sms-spring-boot-starter 1.0-SNAPSHOT 11 11 org.springframework.boot spring-boot-configuration-processor true org.springframework.boot spring-boot-autoconfigure
package com.aichen.sms.springboot.service;
public interface AichenSmsSend {
boolean send(String phoneNum, String content);
}
package com.aichen.sms.springboot.service.impl;
import com.aichen.sms.springboot.service.AichenSmsSend;
public class AichenSmsSendImpl implements AichenSmsSend {
@Override
public boolean send(String phoneNum, String content) {
System.out.println("发送成功,手机号:"+phoneNum+",内容:"+content);
return true;
}
}
3、自动装配配置类
package com.aichen.sms.springboot.config;
import com.aichen.sms.springboot.service.AichenSmsSend;
import com.aichen.sms.springboot.service.impl.AichenSmsSendImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnClass({AichenSmsSend.class, AichenSmsSendImpl.class})
public class SmsAutoConfigure {
@Value("${aichen.sms.securitykey}")
private String securitykey;
@Bean
@ConditionalOnMissingBean
public AichenSmsSend aichenSmsSend(){
if (!"123456".equals(securitykey)){
throw new RuntimeException("爱辰短信服务注册失败,密钥不正确!");
}
return new AichenSmsSendImpl();
}
}
4、创建 spring.factories 将要加载的类配置进去
此配置文件的作用类似于Bean扫描,让Spring动态加载这些类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.aichen.sms.springboot.config.SmsAutoConfigure打包 Starter 到 maven 仓库
mvn clean install四、测试自定义的 Starter 1、引入依赖
2、配置参数com.aichen.sms.springboot aichen-sms-spring-boot-starter 1.0-SNAPSHOT
application.yml
aichen:
sms:
securitykey: 123456
3、调用 Starter 提供的功能
package com.aichen.test.thymeleaf.controller;
import com.aichen.sms.springboot.service.AichenSmsSend;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/aichen/sms")
public class AichenSmsTestController {
@Autowired
private AichenSmsSend aichenSmsSend;
@GetMapping("/send")
public String send(){
boolean send = aichenSmsSend.send("18888888888", "发财啦!");
return send ? "发送成功" : "发送失败";
}
}
五、使 Starter 支持配置参数默认值
以上 SmsAutoConfigure 中使用的 @Value(“${aichen.sms.securitykey}”) 引入配置的方式,不能指定默认值,依赖此 Starter 时必须在 配置文件里增加 aichen.sms.securitykey 的值,否则会报错。
换成以下方式可以给 aichen.sms.securitykey 增加默认值,当引用此 Starter 时不配置 aichen.sms.securitykey 会使用默认值。
使用实体接收配置文件的参数值:
package com.aichen.sms.springboot.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "aichen.sms")
public class AichenSmsProperties {
private String securitykey = "123456";
public String getSecuritykey() {
return securitykey;
}
public void setSecuritykey(String securitykey) {
this.securitykey = securitykey;
}
}
改造 SmsAutoConfigure 自动装配类:
增加 @EnableConfigurationProperties(AichenSmsProperties.class)
securitykey 的值从 实体配置 AichenSmsProperties 中获取。
package com.aichen.sms.springboot.config;
import com.aichen.sms.springboot.service.AichenSmsSend;
import com.aichen.sms.springboot.service.impl.AichenSmsSendImpl;
import org.springframework.beans.factory.annotation.Autowired;
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
@ConditionalOnClass({AichenSmsSend.class, AichenSmsSendImpl.class})
@EnableConfigurationProperties(AichenSmsProperties.class)
public class SmsAutoConfigure {
@Autowired
private AichenSmsProperties aichenSmsProperties;
@Bean
@ConditionalOnMissingBean
public AichenSmsSend aichenSmsSend(){
if (!"123456".equals(aichenSmsProperties.getSecuritykey())){
throw new RuntimeException("爱辰短信服务注册失败,密钥不正确!");
}
return new AichenSmsSendImpl();
}
}



