您现在的位置是:首页 >学无止境 >Spring Boot 的 Starter 以及实现一个自定义Starter网站首页学无止境

Spring Boot 的 Starter 以及实现一个自定义Starter

白白白鲤鱼 2024-06-17 11:28:13
简介Spring Boot 的 Starter 以及实现一个自定义Starter

一、了解 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 如下:

spring-boot-starter-web

用于构建Web的入门工具,包括使用Spring MVC构建Web(包括RESTful)的应用程序。使用 Tomcat 作为默认的嵌入式容器

spring-boot-starter-test

用于测试Spring Boot应用程序的入门程序,包括JUnit,Hamcrest和Mockito等库

spring-boot-starter-data-rest

使用Spring Data REST通过REST公开Spring Data Repository的入门程序

spring-boot-starter-freemarker

使用 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 ,又要重新导入了

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。