Springboot自定义Starter启动器

简介: Springboot自定义Starter启动器.md

image-20230626213619598

一、背景介绍

Springboot Starter机制抛弃了过去创建一个Spring项目需要依赖大量繁琐的jar包和配置信息,同时也规避了版本冲突的问题,做Java开发的经历中一定碰到过引入各种依赖出现版本冲突的噩梦,Starter的出现就是为了规避这样的问题,做到同一个依赖的版本统一。本文主要说明Starter的原理和如何自定义一个Starter启动器。

二、自定义Starter

springboot starter利用自动装载的原理,将starter中的配置项自动加载到IoC容器中,降低配置的复杂性。自定义一个starter的主要步骤为:

  1. 引入POM依赖;
  2. 配置和配置文件对应的xxxProperties类;
  3. 配置业务类;
  4. 配置自动配置xxxAutoConfiguration类;
  5. 配置spring.factories文件;

1.配置POM文件

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>

其中spring-boot-autoconfigure是必须要引入的。

2.定义属性配置类xxxProperties

@ConfigurationProperties(prefix = "com.test")
public class MyStarterProperties {
   
   

    private String name;

    public String getName() {
   
   
        return name;
    }

    public void setName(String name) {
   
   
        this.name = name;
    }
}

MyStarterProperties这个文件的属性和配置文件中的配置项是对应的,@ConfigurationProperties(prefix = "com.test")表示该配置项的key以com.test为前缀。

3.定义自动配置类XXXAutoConfiguration

@EnableConfigurationProperties({
   
   
        MyStarterProperties.class,
})

@Configuration
public class MyStarterAutoConfiguration {
   
   

    @Bean
    MyStarterTemplate getMyStarterTemplate(MyStarterProperties myStarterProperties) {
   
   
        return new MyStarterTemplate(myStarterProperties);
    }
}

MyStarterAutoConfiguration是自动配置类,他会自动加载MyStarterProperties属性配置类,并且会返回MyStarterTemplate这个业务相关的配置类,这个类是和业务相关的,需要我们自己实现。

4.定义业务Bean类

public class MyStarterTemplate {
   
   

    MyStarterProperties myStarterProperties;

    public MyStarterTemplate(MyStarterProperties myStarterProperties) {
   
   
        this.myStarterProperties = myStarterProperties;
    }

    public void printName() {
   
   
        System.out.println("myStarterProperties.getName() = " + myStarterProperties.getName());
    }
}

MyStarterTemplate这个配置类也会被自动加载。

5.定义spring.factories文件

在resources/META-INF创建一个spring.factories文件和spring-configuration-metadata.json文件。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.yangnk.threadpoolstarter.myStarter.MyStarterAutoConfiguration
{
   
   
  "group": [
    {
   
   
      "name": "com.yangnk",
      "type": "com.yangnk.threadpoolstarter.config.MyStarterProperties",
      "sourceType": "com.yangnk.threadpoolstarter.config.MyStarterProperties"
    }
  ],
  "properties": [
    {
   
   
      "name": "com.yangnk.name",
      "type": "java.lang.String",
      "description": "my start name",
      "sourceType": "com.yangnk.threadpoolstarter.myStarter.MyStarterProperties",
      "defaultValue": "MyStarterProperties name"
    }
  ]
}

如果不想要手动实现pring-configuration-metadata.json,引入的spring-boot-configuration-processor依赖会帮我们自动生成。

image-20230626204631425

6.打包测试

通过maven的install命令就可以将该依赖打包到本地仓库。在测试的项目中引入该依赖即可,在Properties配置文件中加上配置项。

image-20230626204906443

image-20230626213150625

image-20230626213059333

三、代码实现

myStarterDemo完整代码:https://github.com/yangnk/SpringBoot_Learning/tree/master/MyStarterDemo


参考资料

  1. 手把手教你实现自定义 Spring Boot 的 Starter:https://xie.infoq.cn/article/68621c5f5c1dc16312e0a52e4
  2. SpringBoot自动装配、启动流程及自定义starter:https://juejin.cn/post/7174031833183551519#heading-3
  3. SpringBoot2.x系列教程60--SpringBoot如何自定义Starter启动器?:https://juejin.cn/post/7180097458351898682
  4. 自定义springboot starter,你学废了吗:https://juejin.cn/post/7127468724046528525
  5. SpringBoot SPI 机制和实现自定义 starter:SpringBoot SPI 机制和实现自定义 starter:https://juejin.cn/post/7132132528810852382
  6. :大聪明教你学Java | 深入浅出聊 SpringBoot 中的 starter 机制:https://juejin.cn/post/7242815848087978040
目录
相关文章
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
1176 0
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
1431 2
|
JavaScript Java 程序员
SpringBoot自动配置及自定义Starter
Java程序员依赖Spring框架简化开发,但复杂的配置文件增加了负担。SpringBoot以“约定大于配置”理念简化了这一过程,通过引入各种Starter并加载默认配置,几乎做到开箱即用。
580 10
SpringBoot自动配置及自定义Starter
|
Java Maven 开发者
编写SpringBoot的自定义starter包
通过本文的介绍,我们详细讲解了如何创建一个Spring Boot自定义Starter包,包括自动配置类、配置属性类、`spring.factories`文件的创建和配置。通过自定义Starter,可以有效地复用公共配置和组件,提高开发效率。希望本文能帮助您更好地理解和应用Spring Boot自定义Starter,在实际项目中灵活使用这一强大的功能。
1205 17
|
Java 数据库连接 Maven
最新版 | SpringBoot3如何自定义starter(面试常考)
在Spring Boot中,starter是一种特殊的依赖,帮助开发人员快速引入和配置特定功能模块。自定义starter可以封装一组特定功能的依赖和配置,简化项目中的功能引入。其主要优点包括模块化、简化配置、提高代码复用性和实现特定功能。常见的应用场景有短信发送模块、AOP日志切面、分布式ID生成等。通过创建autoconfigure和starter两个Maven工程,并编写自动配置类及必要的配置文件,可以实现一个自定义starter。最后在测试项目中验证其有效性。这种方式使开发者能够更便捷地管理和维护代码,提升开发效率。
2240 1
最新版 | SpringBoot3如何自定义starter(面试常考)
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——拦截自定义异常
本文介绍了在实际项目中如何拦截自定义异常。首先,通过定义异常信息枚举类 `BusinessMsgEnum`,统一管理业务异常的代码和消息。接着,创建自定义业务异常类 `BusinessErrorException`,并在其构造方法中传入枚举类以实现异常信息的封装。最后,利用 `GlobalExceptionHandler` 拦截并处理自定义异常,返回标准的 JSON 响应格式。文章还提供了示例代码和测试方法,展示了全局异常处理在 Spring Boot 项目中的应用价值。
658 0
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
2497 15
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
847 2