一、Starter简介
Spring Boot的starter机制是一种便捷的依赖管理工具,它允许开发者快速地引入和配置一系列相关的库和组件。每个starter都是一个专门的集合,包含了启动某个模块所需的配置和依赖项。例如,你想使用reids插件,那么可以直接在pom.xml文件中引入spring-boot-starter-redis后,SpringBoot为我们完成自动装配。引入的组件都是直接嵌入就能够使用,无需过多的配置,而原来各种组件需要的配置都在 stater 中按照默认的方式设定。这也是SpringBoot配置文件相比于SpringMVC极大减少的原因,同时 stater 的配置信息也可以在 Spring Boot 的 yml/properties 配置文件中,从而覆盖默认的配置。
二、Starter的优点
Spring Boot starter的优点包括但不限于以下几点:
- 简化依赖管理:简化了项目依赖管理,自动处理版本兼容性问题,避免了手动配置依赖版本的麻烦。
- 一致的配置:提供了统一的配置方式,减少了配置差异带来的问题。
- 自动配置:Spring Boot根据starter提供的元数据自动配置相关组件,无需编写繁琐的配置代码。
- 易于使用:只需在项目的pom.xml或build.gradle文件中添加对应的starter依赖,无需编写大量配置代码。
- 易于扩展:可以创建自定义的starter,复用和共享代码。
- 快速启动:通过预设的配置,可以快速启动和运行Spring应用程序,减少了项目搭建的时间。
- 模块化设计:每个starter专注于一个功能模块,使得项目结构更加清晰,便于维护和扩展。
- 灵活配置:虽然提供了默认配置,但允许开发者通过配置文件覆盖这些默认值,以适应不同的需求。
三、Starter的组成
Spring Boot starter通常由以下几个组成部分构成:
- 自动配置类:这些是带有
@Configuration
注解的类,它们包含了一系列的Bean定义和方法,这些方法会在特定条件下被调用,从而自动配置应用程序中的服务。例如,spring-boot-starter-web中包含了用于自动配置Tomcat和Spring MVC的类。 - 条件注解:使用
@Conditional
系列注解(如@ConditionalOnClass
,@ConditionalOnMissingBean
等)来定义自动配置类的触发条件。这意味着只有当满足这些条件时,自动配置的Bean才会被创建。 - 自动配置元数据:通过
META-INF/spring.factories
文件定义自动配置类,Spring Boot在启动时会读取这个文件,并根据其中的信息来加载相应的自动配置类。 - 默认配置属性:在
application.properties
或application.yml
中提供默认配置属性,这些属性可以被覆盖,以便于开发者根据自己的需要进行定制化配置。 - 依赖管理:starter会声明其依赖的其他库和模块,并通过Spring Boot的依赖管理机制,确保所有依赖项的版本兼容性。
- 示例配置:通常会包含一些示例配置文件,以展示如何使用starter中的功能。
- 资源文件:可能包含视图模板、静态资源、配置文件等,这些资源文件可以被应用程序直接使用。
- 测试支持:提供单元测试和集成测试的支持,有时会包含一些测试类和测试配置。
- 文档:良好的starter通常会附带详细的文档,说明如何使用starter以及如何自定义配置。
四、Starter工作原理
Spring Boot Starter的工作原理基于以下几个关键点:
- 依赖管理:每个Starter定义了一组依赖关系,当你在项目中引入一个Starter时,所有声明在该Starter中的依赖也会被自动下载到项目中,无需单独声明。Spring Boot利用Maven或Gradle的依赖管理机制来确保版本兼容性,避免了手动解决依赖版本冲突的麻烦。
- 自动配置:Starters包含了自动配置类,这些类使用Spring的条件注解(如
@ConditionalOnClass
、@ConditionalOnMissingBean
等)来决定是否激活特定的配置。例如,如果项目中有spring-boot-starter-web
依赖,那么Spring Boot会自动配置一个嵌入式的Tomcat服务器和Spring MVC的DispatcherServlet
。 - 约定优于配置:Spring Boot Starter遵循约定优于配置的原则,提供了一套默认的配置,这意味着开发者不需要编写大量配置代码,Spring Boot会基于默认规则配置应用程序。当然,这些默认值可以通过
application.properties
或application.yml
文件进行覆盖。 - 属性配置:Starters提供了一组配置属性,这些属性可以在配置文件中进行自定义,从而让开发者根据实际需求调整应用程序的行为,而无需修改代码。
- 条件加载:Spring Boot使用条件注解来决定是否加载某个组件。这意味着只有当相关的类或Bean在类路径上存在时,相关的配置才会生效。
- SPI机制:Spring Boot Starter可以通过服务提供者接口(SPI)机制进行扩展。开发者可以通过实现自定义的SPI来扩展Starter的功能或替换掉Starter内部的某些组件。
五、创建自定义Starter
创建一个自定义的Spring Boot Starter通常涉及以下几个步骤:
- 新建Maven项目:使用Spring Initializr(https://start.spring.io/)或者手动创建一个新的Maven项目,并确保添加了
spring-boot-starter-parent
作为父POM,以便继承Spring Boot的配置。在新建Maven项目的pom文件中置合适的groupId
、artifactId
和版本号
,官方建议自定义starter的artifactId
使用xxx-spring-boot-starter 命名规则,以区分SpringBoot生态提供的starter。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.x.x.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>test-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
- 添加依赖:根据需要添加你的Starter依赖的库。如果你的Starter依赖于其他已有的Starters,比如
spring-boot-starter-web
,那么你应该在pom.xml中添加相应的依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 其他依赖 -->
</dependencies>
- 创建自动配置类:创建一个带有@Configuration注解的Java类,这个类将包含自动配置的Bean定义。使用
@ConditionalOnClass
、@ConditionalOnMissingBean
等注解来确保配置仅在特定条件下生效才会被加载。
@Configuration
@EnableAutoConfiguration
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyComponent myComponent() {
return new MyComponent();
}
}
- 配置属性类:如果你的Starter需要支持配置属性,可以创建一个配置属性类,并用
@ConfigurationProperties
注解绑定配置文件中的属性。这个类通常与自动配置类一起使用。
@ConfigurationProperties(prefix = "my.starter")
public class MyProperties {
private String someProperty;
// getters and setters
}
- 创建spring.factories文件:在
src/main/resources/META-INF
目录下创建spring.factories
文件,并在其中列出你的自动配置类。这是Spring Boot自动发现和加载配置类的机制。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.starter.MyAutoConfiguration
- 打包和部署:将你的Starter打包成JAR文件,并部署到Maven中央仓库或其他可用的仓库中。
mvn clean install
- 使用自定义Starter:在其他Spring Boot项目中,添加你的自定义Starter作为依赖,Spring Boot将自动检测并应用你的配置。
<dependency>
<groupId>com.example</groupId>
<artifactId>test-spring-boot-starter</artartifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
自定义Starter的关键点就是在spring.factories
文件中,指定了自动配置类MyAutoConfiguration
,Spring Boot在启动时会加载这个自动配置类,同时把这个配置类下定义的符合条件的Bean加载进来。这样当你在其他项目中引入你这个自定义的Starter时,就可以直接使用这些Bean了。