前言:我一直想自定义一个starter,上传到maven仓库中,以供我之后项目的使用。在网上看到了几个教程,但是好像一直不太对。我询问了大神之后,才发现是spring boot的版本问题。
我们在自定义starter时,要将我们的自动配置类放到META-INF目录下。但是由于spring boot的版本变化问题。自动配置类要存放的文件有了点变化。
1、在spring boot2.7版本之前:
通过META-INF/spring.factories文件定义我们自动配置的类。
2、在spring boot2.7~spring boot3.0版本之间,是兼容了
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 和
META-INF/spring.factories 这两个文件的。
3、在spring boot3.0版本之后,只支持使用
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
来自定义我们的自动配置的类。
自定义starter:
spring boot版本3.0.12、jdk17。
1、创建一个spring boot工程,并导入如下的依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- 自动装配依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <!--自动装配依赖非必需依赖,该依赖作用是在使用IDEA编写配置文件有代码提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
2、把pom文件中的<build>标签中的<plugin>的spring boot maven打包插件删除掉,我们不需要将这个starter打成能自动启动的jar文件,甚至你的启动类也可以删除掉。(spring boot maven打包插件一定要删除掉,不然打出来的jar包不能正常使用。)
3、在这个自定义的starter中写几个bean,并输出一些信息,表明它们能够在其他spring boot项目中正常使用。
(1)、定义一个属性类,用来读取配置文件中的属性:(如果想要设置默认值得话,可以直接在定义属性的时候设置一个初始值,这样你不在yml配置文件中明确指定值的话,默认就有初始值,在yml文件中指定值会覆盖掉我们写的默认值。)
@Component
@ConfigurationProperties(prefix = "student")
@Data
public class StudentProperties {
/**
* 姓名
*/
private String name;
//private String name="张乔";
/**
* 年龄
*/
private Integer age;
/**
* 性别
*/
private String sex;
}
(2)、定义一个service类,用来输出一下配置类:
public class StudentService { @Autowired private StudentProperties studentProperties; public void print() { System.out.println("姓名:"+studentProperties.getName()); System.out.println("年龄:"+studentProperties.getAge()); System.out.println("性别:"+studentProperties.getSex()); } }
(3)、定义一个配置类,将我们要用到的这两个类进行@Import注入:
@AutoConfiguration @Import({StudentService.class, StudentProperties.class}) public class AutoConfig { }
(4)、在资源目录下,创建
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
注意名字一定不能写错,前两个是目录,最后一个是文件。如果写对了,idea会有提示的:
在org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中,指定你的配置类的路径。如:
配置yml提示:
将spring-configuration-metadata.json文件复制一份到META-INF/spring目录下,这样就可以在yml配置文件中使用时在后面给出提示。
(5)、运行maven命令,可以将这个自定义的starter上传到maven仓库中。
1、运行
mvn clean install -DskipTests
2、直接使用idea上提供的生命周期:
(6)、现在就将这个starter上传到了本地的maven仓库中,接下来可以只要导入自定义starter的依赖,在任意的项目中使用。
我随意的打开一个项目,并导入starter的依赖:
在配置文件中输入我们在自定义starter中定义的前缀:
由于你引入了spring-boot-configuration-processor,因此在配置文件中输入时会有提示,这也进一步说明我们的starter气作用了。
在测试文件中进行测试:
输出结果如下:
能得到输出结果,证明我们的自定义的starter是成功的。
总结:
spring boot自定义starter在我们日常的工作和学习中,作用是非常巨大的。可以将一些共性的功能抽离出来供我们进行使用,我这次只是介绍了最基础的一个自定义starter的demo,如果你想要进行更复杂的功能,尽管去做了,大名鼎鼎的hutool工具包不就是一个整合了非常多功能的jar包。
自定义starter的原理是基于spring boot的自动配置,简单来说就是@EnableAutoConfiguration
注解会去扫描
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(这个路径可不是我胡说的,在springboot的注解中详细声明了会自动扫描的文件名称和路径,那么基于springboot框架封装的一些组件。要想将bean注入到IOC容器中,也要遵循springboot的约定。这就是springboot框架的核心思想。约定大于配置大于编码)
中的配置类,并将符合条件的bean注册到IOC容器中。更详细的原理咱也说不上来。有兴趣的可以去看看spring boot自动装配的流程,深入了解一下springboot框架的源码。