一、了解 Spring Boot Starter
Spring Boot Starter 是 Spring Boot 中一个重要概念,它是一种提供依赖项的方式,简化 Spring 应用程序依赖管理,将一组相关的依赖项打包在一起,并提供一个依赖项描述文件,使开发人员可以快速集成。关于应用场景说白了,就是可以帮助开发人员快速集成各种第三方库和框架。
Spring Boot Starter 核心原理是 Spring Boot 自动配置机制,它是 Spring Boot 的一个重要特性,也是实现 Spring Boot Starter 关键。具体来说,自动配置机制会根据 classpath 上存在的 jar 包和配置文件,自动创建 Spring Bean,完成对应的配置。开发人员只需要引入对应的 Starter,就能够自动配置所需的 Bean,不需要手动编写配置文件。
常用的 Spring Boot Starter 如下:
| 用于构建Web的入门工具,包括使用Spring MVC构建Web(包括RESTful)的应用程序。使用 Tomcat 作为默认的嵌入式容器 |
| 用于测试Spring Boot应用程序的入门程序,包括JUnit,Hamcrest和Mockito等库 |
| 使用Spring Data REST通过REST公开Spring Data Repository的入门程序 |
| 使用 FreeMarker 视图构建 MVC Web 应用程序的入门器 |
详细介绍请移步:
Starter官网 (spring.io)
二、Spring Boot Starter 的实现原理
Spring Boot Starter 的实现原理可以分为两个方面:Maven 依赖管理和自动配置。
Maven 依赖管理
在 Maven 中,Starter 是一个 POM 文件,定义了一组依赖项和插件,用于配置和管理应用程序的依赖项。例如,对于 Spring Boot Web Starter,它包含以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.2</version>
</dependency>
这个依赖项将会引入一组 Spring MVC 相关的依赖项,包括 Spring Web、Tomcat、Jackson 等。而这些依赖项会在应用程序启动时自动配置,使得开发人员无需手动配置。
自动配置
Spring Boot 的自动配置是基于条件化配置(Conditional Configuration)机制实现的。条件化配置允许开发人员定义一组条件,当这些条件满足时,自动配置模块会被启用。
例如,对于 Spring Boot Web Starter,它包含以下条件化配置类:
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })
@ConditionalOnMissingBean({ Servlet.class, DispatcherServlet.class })
这些条件表示该 Starter 适用于 Web 应用程序,并且在类路径中存在 Servlet 和 DispatcherServlet 类,同时不存在与这些类相关的 Bean。如果这些条件都满足,自动配置模块就会被启用,并为应用程序自动配置一些基本的 Web 相关功能。
三、使用 Starter (快速入门)
这个比较简单,直接将需要的需要使用的依赖加入到pom.xml文件中(就不截图举例子了),但如果是引用别人封装好的依赖则需要这样写:(这样的写法主要是 这个依赖没有上传到 Maven 仓库中去),如果上传到maven仓库则需要,配置nexus私服,进行后续操作。
四、自己实现一个 Starter ,自定义Starter(知识应用)
Spring Boot提供了很多已经集成好的starter,如spring-boot-starter-web、
spring-boot-starter-data-jpa等,我们也可以开发自定义的starter来集成自己的组件和依赖项。
开发自定义starter的步骤如下:
1、创建一个maven项目,命名为xxxx-spring-boot-starter,其中xxxx为组件的名称。(官方的maven项目,命名为 spring-boot-starter-xxxx ,其中xxxx为组件的名称)
在项目的pom.xml文件中添加spring-boot-starter-parent依赖,以及spring-boot-starter依赖,用于引入Spring Boot框架和相关组件。
2、创建一个自动配置类,该类需要使用@Configuration和@EnableConfigurationProperties注解,并在其中定义需要自动配置的组件。
package com.example.demo;
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.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Description:
* Spring Boot中的自动配置主要是通过@Configuration注解实现的 @Configuration注解用于指示Spring容器使用一个类作为配置类
* 类中的@Bean方法可以用来定义Spring组件。
*/
@Configuration
@EnableConfigurationProperties(MyStarterProperties.class)
/**
* Description:
* 当类路径classpath下有指定的类的情况下进行自动配置 ,Spring Boot的自动配置机制通过在classpath中查找META-INF/spring.factories文件来实现。
* 该文件中定义了Spring Boot应用程序所需的所有自动配置类。当应用程序启动时,Spring Boot框架会自动加载并运行这些自动配置类。
*/
@ConditionalOnClass(MyStarter.class)
/**
* Description: 配置文件中matchIfMissing =true时进行自动配置
*/
//第二步:定义/创建一个自动配置类,MyStarterServiceAutoConfiguration
@ConditionalOnProperty(prefix = "spring.mystarter", value = "enabled", matchIfMissing = true)
public class MyStarterServiceAutoConfiguration {
@Autowired
private MyStarterProperties myproperties;
@Bean
/**
* Description: 当容器中没有指定Bean的情况下,自动配置MyStarterService类
* 在加载自动配置类的过程中,Spring Boot框架会对每个@Configuration注解的类进行解析,并通过条件判断决定是否需要执行该类中的@Bean方法。
* 如果条件满足,则会自动创建该组件,并将其加入到Spring容器中。
*/
@ConditionalOnMissingBean(MyStarter.class)
public MyStarter MyStarterService(){
MyStarter myStarterService = new MyStarter(myproperties);
return myStarterService;
}
}
当然这个demo 相应的还有一些补充(这个地方,对于不同的starter 情况都不一样)
3、在src/main/resources/META-INF/spring.factories文件中添加自动配置类的全限定名。(spring.factories文件必须要在classpath路径(resources)下的/META-INF文件夹下,并且名字必须为spring.factories。这是因为springboot自动装配机制就是通过这个路径下的spring.factories文件去加载类或者依赖的。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyStarterServiceAutoConfiguration
4、发布starter
自定义starter的开发流程就是这样,可以根据自己的实际需求,将需要的依赖进行封装,并开发自动配置类和配置文件,最终将其打包成jar包,上传到maven中央仓库或私有仓库中,就可以供其他开发者使用了。需要注意的是,在开发自定义starter时,应遵循Spring Boot的约定大于配置的原则,并且要充分测试自动配置类的正确性和可用性,以确保自定义starter可以在不同的环境中正确地使用。
5、编写测试类测试
先把starter 依赖导入,(由于我没有上传到maven 仓库中去,就放在了我电脑的本地maven 仓库中去,但别人使用就不方便,实际开发操作应该不会这样)
然后,输入参数进行测试
测试完成
五、踩坑
不要这样去引入依赖,一旦clean ,又要重新导入了