开发公司业务时,如何去封装公共通用的代码,常见的选择是工具类之类,但是如果我们又需要在其他项目中使用呢?工具类复制一份过去?还有就是定义成单独的模块,也很好,但其实有个更好的选择是使用自定义
starter
,自定义的starter
在使用起来会非常方便,这篇文章主要讲讲如何自定义starter
,大家可以基于此去封装公司中的一些公共代码。
介绍 starter
starter
是SpringBoot
中非常重要的一个机制,他是基于约定优于配置
的思想所衍生出来的,摒弃了以前像Spring
中需要使用一个依赖,需要添加非常多的配置,starter
会在引入依赖时自动扫描需要加载的默认模块及配置,发现我们所定义的Bean
并自动注册到IOC
容器中。
一、创建 SpringBoot 项目并引入依赖
命名规范
SpringBoot
官方的starter
命名规范为:spring-boot-starter-{name}
- 自定义
starter
命名规范为:{name}-spring-boot-starter
首先通过IDEA
创建一个SpringBoot
项目。
这里我通过一个简单的日志功能来实现自定义starter
功能,创建一个mylog-spring-boot-starter
项目。对应的pom
文件:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.7.15
com.jk
mylog-spring-boot-starter
0.0.1-SNAPSHOT
mylog-spring-boot-starter
mylog-spring-boot-starter
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-autoconfigure
org.springframework.boot
spring-boot-configuration-processor
org.projectlombok
lombok
1.18.28
引入的依赖:
spring-boot-autoconfigure:
这个依赖是实现自动配置的核心依赖,它会根据定义的META-INF/spring.factories
里面定义的类全路径去找到这个类,然后根据@Bean
注解所描述的方法注册Bean
到IOC
容器中。spring-boot-configuration-processor:
这个依赖是为了实现在application.yml
中定义配置时的提示功能。lombok:
实现类中自动补全getter
、setter
、构造器
等方法。
二、定义核心的 Service
这个service
即在业务项目引入这个starter
时可以自动装配的类。
service.MyLogService:
import lombok.Data;
@Data
public class MyLogService {
private String prefix;
private String suffix;
public void print(String log) {
System.out.println(prefix + " " + log + " " + suffix);
}
}
定义了一个print
方法,实现日志的打印,日志的前缀和后缀我们会在后面的Properties
中定义一个默认的,也可以通过在引入这个starter
的业务模块中通过配置文件修改。
三、定义 Properties
定义Properties
类来实现JavaConfig
功能,把application.yml
或application.properties
中的配置读取映射到Java
类上。
config.MyLogProperties:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConfigurationProperties(prefix = "mylog")
public class MyLogProperties {
private String prefix = "myPrefix";
private String suffix = "mySuffix";
}
@Data:
通过这个lombok
的注解实现类的setter
、getter
、构造器
方法的自动补全。@ConfigurationProperties:
通过这个注解实现类与配置文件的绑定和值的注入,通过prefix
可以定义在配置文件中的统一前缀。比如配置文件中mylog.prefix
的值就会绑定到类中prefix
属性上。
四、定义 AutoConfiguration
定义AutoConfiguration
类,引入starter
时,会自动配置的类,它会自动注册里面的@Bean
到spring
中IOC容器中。
config.MyLogAutoConfiguration:
import com.jk.mylogspringbootstarter.service.MyLogService;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(MyLogProperties.class)
public class MyLogAutoConfiguration {
@Bean
public MyLogService demoModule(MyLogProperties properties) {
MyLogService myLogService = new MyLogService();
myLogService.setPrefix(properties.getPrefix());
myLogService.setSuffix(properties.getSuffix());
return myLogService;
}
}
@Configuration:
表明这是SpringBoot
中的配置类。@EnableConfigurationProperties:
使我们之前定义的Properties
生效。@Bean:
引入starter
时自动注册的Bean
。
五、定义 spring.factory
在resources
中创建META-INF
目录并创建spring.factories
文件。写入以下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.jk.mylogspringbootstarter.config.MyLogAutoConfiguration
上面这行内容固定,表示自动配置的类路径,下面需写我们之前定义的AutoConfiguration
的全路径。
到此我们自定义starter
源代码部分就完成了,整体的代码结构如下:
六、打包 starter,并在项目中测试
在IDEA
中通过maven install
在进行打包
或者通过在命令行中执行mvn clear install
来进行打包,打包后会把这个依赖包安装到我们本地maven
仓库。
在业务项目中:
1. pom
中引入对应的starter
com.jk
mylog-spring-boot-starter
0.0.1-SNAPSHOT
2. 自动装配在starter
中定义的MyLogService
3. 日志打印结果
可以看到日志的前缀和后缀为之前我们在Properties
中定义的默认值。
4. 修改日志前缀、后缀配置
通过在业务项目中application.yml
修改前缀和后缀
测试打印结果如下:
到此,自定义starter
的整体开发与使用就完成了,如果有什么不明白的小伙伴,可以评论区留言讨论哦。希望大家多多点赞
、收藏
。