前言
本章内容主要讲解如何自定义制作一个Spring Boot Starter,那么我们需要简略了解一下SpringBoot Starter的Jar包是加载方式。大体流程其实就是启动时,会去依赖的 starter 包中寻找 /META-INF/spring.factories 文件,然后根据文件中配置的路径去扫描项目所依赖的 Jar 包,这类似于 Java 的 SPI 机制,只不过可以使用@Conditional 系列注解实现更加精确的配置加载Bean的条件。
JavaSPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。
快速实践
1、新建工程
新建一个SpringBoot工程,命名为spring-boot-starter-smarkReply,pom文件引入依赖,如下所示
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.3</version>
</dependency>
</dependencies>
工程命名规范
官方命名格式为:spring-boot-starter-{name}
非官方建议命名格式:{name}-spring-boot-starter
这里只是为了演示,个人跟随官方命名规范。
2、新建ReplyProperties类
新建ReplyProperties类,定义一个msg参数(默认值nice to meet you!)。
@ConfigurationProperties(prefix = "reply")
public class ReplyProperties {
private String msg = "nice to meet you!";
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
3、新建ReplyService类
新建ReplyService类,使用ReplyProperties类的属性。
@Service
public class ReplyService {
@Autowired
private ReplyProperties replyProperties;
/**
* 打招呼
* @param name
* @return
*/
public String sayHello(String name){
return "Hello "+name+","+replyProperties.getMsg();
}
}
4、新建自动配置类
自动配置类,可以理解为实现自动配置功能的一个入口。
@Configuration //定义为配置类
@ConditionalOnWebApplication //在web工程条件下成立
@EnableConfigurationProperties({ReplyProperties.class})//启用ReplyProperties配置功能,并加载到ioc容器
@Import(ReplyService.class) //导入ReplyService组件
public class ReplyAutoConfiguration {
}
5、新建spring.factories文件
在resources目录下新建META-INF目录,并在META-INF下新建spring.factories文件,写入:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.example.springbootstartersmarkReply.config.ReplyAutoConfiguration
6、安装工程
整体的工程目录如下
执行mvn install将spring-boot-starter-smarkReply安装到本地。
检查工程包
测试结果
新建一个Spring Boot工程,引入spring-boot-starter-smarkReply依赖。
创建测试方法
@Autowired
private ReplyService replyService;
@GetMapping(value = "/testReply")
public void testReply() {
String msg = replyService.sayHello("Mis Li");
System.out.println(msg);
}
调用测试方法,查看结果
到目前为止,spring-boot-starter-smarkReply的自动配置功能已实现,并且正确使用了