如何实现自己的starter

150 阅读6分钟

认识spring-boot-starter

Spring Boot Starter是一种特定类型的依赖项,它能够简化和加速Spring Boot应用程序的配置和集成过程。它提供了一组预配置的依赖项和自动化配置,使得开发者能够快速集成各种功能和第三方库,而无需手动进行繁琐的配置。

一个Spring Boot Starter通常由以下几个部分组成:

  1. 自动配置:Starter包含了一组自动配置类,这些类会根据环境和依赖的存在自动配置应用程序所需的各种组件、服务和功能。
  2. 依赖管理:Starter会管理应用程序所需的所有依赖项,包括Spring Boot核心依赖和相关的第三方库。通过引入适当的Starter,可以确保所有需要的依赖项都能正确加载。
  3. 配置属性:Starter提供了一组预定义的配置属性,开发者可以通过设置这些属性来自定义应用程序的行为。这些配置属性通常是通过application.propertiesapplication.yml文件进行配置。

使用Spring Boot Starter的好处包括:

  1. 简化配置:Starter自动配置了各种组件和功能,无需手动编写大量的配置代码,可以快速启动一个工作的应用程序。
  2. 快速集成:Starter提供了对各种第三方库和框架的集成支持,通过引入相应的Starter,可以快速集成所需的功能。
  3. 标准化依赖管理:Starter统一管理依赖项,避免了版本冲突和依赖关系管理的烦恼。
  4. 可扩展性和灵活性:Starter允许开发者自定义配置属性,根据具体需求进行自定义扩展,以适应不同的业务场景。

常见的Spring Boot Starter有很多,例如spring-boot-starter-web用于构建Web应用程序,spring-boot-starter-data-jpa用于集成JPA数据访问等。你可以根据具体业务需求选择并引入相应的Starter,以简化开发过程并提高效率。

实现自己的spring-boot-starter

一、具体实现步骤

要实现自己的Spring Boot Starter,可以按照以下步骤进行:

步骤1:创建一个新的Maven或Gradle项目。可以选择使用Spring Initializr来快速生成项目结构和依赖。

步骤2:在项目中创建自定义的Starter模块,通常以spring-boot-starter-开头命名。该模块将作为自定义Starter的核心部分。

步骤3:定义自定义Starter的自动配置类。在Starter模块中创建一个或多个自动配置类,用于配置和初始化所需要的组件、服务或功能。自动配置类通常使用@Configuration@ConditionalOnClass@ConditionalOnProperty等条件注解来控制配置的生效条件。

步骤4:提供自定义Starter的配置属性。在Starter模块中创建一个propertiesyaml文件,定义Starter所需的配置属性。可以使用@ConfigurationProperties注解将属性绑定到对应的配置类上,并提供默认值和注释说明。

步骤5:编写示例代码和配置。在Starter模块的src/main/resources目录下,创建示例配置文件(如application.propertiesapplication.yml),并添加必要的配置项。

步骤6:打包和发布Starter模块。使用Maven或Gradle将自定义Starter模块打包,并发布到本地或私有仓库。

步骤7:创建一个新的Spring Boot应用程序项目,然后在项目中引入自定义的Starter依赖。

步骤8:启动应用程序并验证自定义Starter的功能是否生效。

二、Demo示例演示

  1. 创建新的Maven项目,并在pom.xml中添加以下依赖:
xmlCopy Code
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>
  1. 创建名为spring-boot-starter-demo的模块,并在该模块中创建src/main/java目录结构。
  2. src/main/java目录下创建一个自动配置类DemoAutoConfiguration.java,示例如下:
@Configuration
@EnableConfigurationProperties(DemoProperties.class)
public class DemoAutoConfiguration {

    private final DemoProperties properties;

    public DemoAutoConfiguration(DemoProperties properties) {
        this.properties = properties;
    }

    @Bean
    public DemoService demoService() {
        return new DemoService(properties.getMessage());
    }
}
  1. src/main/java目录下创建一个配置属性类DemoProperties.java,示例如下:
@ConfigurationProperties(prefix = "demo")
public class DemoProperties {

    private String message = "Hello, World!";

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
  1. src/main/resources目录下创建一个名为application.properties的示例配置文件,并添加以下内容:
demo.message=Hello from custom starter!
  1. 打包和发布Starter模块:
$ mvn clean install
  1. 创建一个新的Spring Boot应用程序,并在pom.xml中引入自定义Starter依赖:
<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>spring-boot-starter-demo</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>
  1. 在应用程序的代码中使用自定义Starter中的功能,示例如下:
@RestController
public class DemoController {

    private final DemoService demoService;

    public DemoController(DemoService demoService) {
        this.demoService = demoService;
    }

    @GetMapping("/hello")
    public String hello() {
        return demoService.getMessage();
    }
}
  1. 启动应用程序,并访问http://localhost:8080/hello,应该能够看到返回的消息为"Hello from custom starter!"。

三、项目结构等

1、项目结构

image.png 2、FetchCodeServiceAutoConfiguration 认识: 这段代码是一个自动配置类,用于将FetchCodeService实例化并注入到Spring IoC容器中。

首先,使用@Configuration注解将这个类标记为配置类,告诉Spring容器需要从这个类中加载配置。

接着,使用@EnableConfigurationProperties(FetchCodeProperties.class)注解启用对FetchCodeProperties配置属性类的支持,使得可以将配置属性注入到这个自动配置类中。

接下来,通过构造方法注入FetchCodeProperties对象,并将其赋值给类中的fetchCodeProperties变量。这样做是为了获取外部配置文件中的属性值。

然后,在@Bean注解的方法中,使用@ConditionalOnMissingBean注解表示仅当容器中不存在FetchCodeService类型的Bean时才会执行这个方法。这样做可以避免重复创建Bean。

在这个方法中,根据FetchCodeProperties对象的属性值,调用FetchCodeService的构造方法创建一个实例,并将其返回。

最终,Spring容器会自动将FetchCodeService添加到IoC容器中,供其他组件使用。

总结:这段代码是一个自动配置类,它根据外部配置文件中FetchCodeProperties类的属性值,实例化并注入了一个FetchCodeService对象到Spring IoC容器中,以供其他组件使用。

/**
 * 配置类,基于Java代码的bean配置
 */
@Configuration
@EnableConfigurationProperties(FetchCodeProperties.class)
public class FetchCodeServiceAutoConfiguration {
    private FetchCodeProperties fetchCodeProperties;

    //通过构造方法注入配置属性对象HelloProperties
    public FetchCodeServiceAutoConfiguration(FetchCodeProperties fetchCodeProperties) {
        this.fetchCodeProperties = fetchCodeProperties;
    }
    //实例化HelloService并载入Spring IoC容器
    @Bean
    @ConditionalOnMissingBean
    public FetchCodeService fetchCodeService(){
        return new FetchCodeService(fetchCodeProperties.getAppId(), fetchCodeProperties.getAppSecret(), fetchCodeProperties.getUrl(), fetchCodeProperties.getExpiration(), fetchCodeProperties.getSecretkey());
    }
}

3、认识src/main/resources/META-INF/spring.factories 这段代码是一个配置文件,通常命名为spring.factories,用于指定自动配置类的类名。

在Spring Boot中,使用@EnableAutoConfiguration注解可以自动启用和加载一组预定义的自动配置类。这些自动配置类负责根据应用程序的依赖和配置信息,自动配置和装配各种组件和功能。

在这个配置文件中,org.springframework.boot.autoconfigure.EnableAutoConfiguration是键,表示需要自动启用和加载自动配置类。

com.hmall.config.FetchCodeServiceAutoConfiguration是对应的值,即自动配置类FetchCodeServiceAutoConfiguration的完全限定类名。

通过将自动配置类的类名添加到spring.factories文件中,可以告诉Spring Boot在启动时自动加载该自动配置类,并进行相应的配置和初始化操作。

总结:这段代码是一个配置文件,指定了要自动启用和加载的自动配置类FetchCodeServiceAutoConfiguration。在应用程序启动时,Spring Boot会自动识别并加载该类,完成相应的配置和初始化操作。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.hmall.config.FetchCodeServiceAutoConfiguration