Spring Boot Starters启动器

Spring Boot Starters启动器文章目录 Starters 是什么 Starters 命名 Starters 分类 1 SpringBoot 应用类启动器 2 SpringBoot 生产启动器 3 SpringBoot 技术类启动器 Starters 是什么 Starters 可以理解为启动器 它包含了一系列可以集成到应用里面的依赖包 你可以一站式集成 Spring 及其他技术 而不需要到处找示例代码和依赖包 如你想使用 SpringJPA 访问数据库 只要加入 spring boot starter data jpa 启动器依赖就能使用了 Starters

Starters是什么?

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。

Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

传统的做法

在没有starter之前,假如我想要在Spring中使用jpa,那我可能需要做以下操作:

  1. 在Maven中引入使用的数据库的依赖(即JDBC的jar)
  2. 引入jpa的依赖
  3. 在xxx.xml中配置一些属性信息
  4. 反复的调试直到可以正常运行
    需要注意的是,这里操作在我们每次新建一个需要用到jpa的项目的时候都需要重复的做一次。也许你在第一次自己建立项目的时候是在Google上自己搜索了一番,花了半天时间解决掉了各种奇怪的问题之后,jpa终于能正常运行了。有些有经验的人会在OneNote上面把这次建立项目的过程给记录下来,包括操作的步骤以及需要用到的配置文件的内容,在下一次再创建jpa项目的时候,就不需要再次去Google了,只需要照着笔记来,之后再把所有的配置文件copy&paste就可以了。

像上面这样的操作也不算不行,事实上我们在没有starter之前都是这么干的,但是这样做有几个问题:

  1. 如果过程比较繁琐,这样一步步操作会增加出错的可能性
  2. 不停地copy&paste不符合Don’t repeat yourself精神
  3. 在第一次配置的时候(尤其如果开发者比较小白),需要花费掉大量的时间
    使用Spring Boot Starter提升效率
    starter的主要目的就是为了解决上面的这些问题
    starter的整体逻辑:
    在这里插入图片描述








starter的理念:starter会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦。需要注意的是不同的starter是为了解决不同的依赖,所以它们内部的实现可能会有很大的差异,例如jpa的starter和Redis的starter可能实现就不一样,这是因为starter的本质在于synthesize,这是一层在逻辑层面的抽象,也许这种理念有点类似于Docker,因为它们都是在做一个“包装”的操作,如果你知道Docker是为了解决什么问题的,也许你可以用Docker和starter做一个类比。

starter的实现:虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfiguration。因为Spring Boot坚信“约定大于配置”这一理念,所以我们使用ConfigurationProperties来保存我们的配置,并且这些配置都可以有一个默认值,即在我们没有主动覆写原始配置的情况下,默认值就会生效,这在很多情况下是非常有用的。除此之外,starter的ConfigurationProperties还使得所有的配置属性被聚集到一个文件中(一般在resources目录下的application.properties),这样我们就告别了Spring项目中XML地狱。

Starters命名

Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。

第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。

Starters分类

1. Spring Boot应用类启动器

启动器名称 功能描述
spring-boot-starter 包含自动配置、日志、YAML的支持。
spring-boot-starter-web 使用Spring MVC构建web 工程,包含restful,默认使用Tomcat容器。

2. Spring Boot生产启动器

启动器名称 功能描述
spring-boot-starter-actuator 提供生产环境特性,能监控管理应用。

3. Spring Boot技术类启动器

启动器名称 功能描述
spring-boot-starter-json 提供对JSON的读写支持。
spring-boot-starter-logging 默认的日志启动器,默认使用Logback。

4. 自定义启动器

  1. 创建一个starter项目,关于项目的命名你可以参考这里
  2. 创建一个ConfigurationProperties用于保存你的配置信息(如果你的项目不使用配置信息则可以跳过这一步,不过这种情况非常少见)
  3. 创建一个AutoConfiguration,引用定义好的配置信息;在AutoConfiguration中实现所有starter应该完成的操作,并且把这个类加入spring.factories配置文件中进行声明
  4. 打包项目,之后在一个SpringBoot项目中引入该项目依赖,然后就可以使用该starter了
    我们来看一个例子

首先新建一个Maven项目,设置 pom.xml 文件如下:

 
   
   
   
     4.0.0 
    
   
     http-starter 
    
   
     0.0.1-SNAPSHOT 
    
    
    
    
    
      org.springframework.boot 
     
    
      spring-boot-starters 
     
    
      1.5.2.RELEASE 
     
    
    
     
     
     
       org.springframework.boot 
      
     
       spring-boot-starter 
      
     
     
     
     
       org.projectlombok 
      
     
       lombok 
      
     
       1.16.10 
      
     
    
   

创建proterties类来保存配置信息:

@ConfigurationProperties(prefix = “http”) // 自动获取配置文件中前缀为http的属性,把值传入对象参数

@Setter @Getter public class HttpProperties { // 如果配置文件中配置了http.url属性,则该默认属性会被覆盖 private String url = "http://www.baidu.com/"; } 上面这个类就是定义了一个属性,其默认值是 http://www.baidu.com/,我们可以通过在 application.properties 中添加配置 http.url=https://www.zhihu.com 来覆盖参数的值。 创建业务类: @Setter @Getter public class HttpClient { private String url; // 根据url获取网页数据 public String getHtml() { try { URL url = new URL(this.url); URLConnection urlConnection = url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8")); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line).append("\n"); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return "error"; } } 

这个业务类的操作非常简单,只包含了一个 url 属性和一个 getHtml 方法,用于获取一个网页的HTML数据,读者看看就懂了。

创建AutoConfiguration

@Configuration @EnableConfigurationProperties(HttpProperties.class) public class HttpAutoConfiguration { @Resource private HttpProperties properties; // 使用配置 // 在Spring上下文中创建一个对象 @Bean @ConditionalOnMissingBean public HttpClient init() { HttpClient client = new HttpClient(); String url = properties.getUrl(); client.setUrl(url); return client; } } 

最后,我们在 resources 文件夹下新建目录 META-INF,在目录中新建 spring.factories 文件,并且在 spring.factories 中配置AutoConfiguration:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.nosuchfield.httpstarter.HttpAutoConfiguration 

到此,我们的starter已经创建完毕了,使用Maven打包该项目。之后创建一个SpringBoot项目,在项目中添加我们之前打包的starter作为依赖,然后使用SringBoot来运行我们的starter,代码如下:

@Component public class RunIt { @Resource private HttpClient httpClient; public void hello() { System.out.println(httpClient.getHtml()); } } 

正常情况下此方法的执行会打印出url http://www.baidu.com/的HTML内容,之后我们在application.properties中加入配置:

http.url=https://www.zhihu.com/

再次运行程序,此时打印的结果应该是知乎首页的HTML了,证明properties中的数据确实被覆盖了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219723.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午10:02
下一篇 2026年3月17日 下午10:02


相关推荐

  • 计算机 原码、反码、补码(相互转化)

    计算机 原码、反码、补码(相互转化)一 基本概念在计算机系统中 数值一律用补码来表示和存储 原因在于 使用补码 可以将符号位和数值域统一处理 同时 加法和减法也可以用补码统一处理 此外 补码与原码相互转换 其运算过程是相同的 不需要额外的硬件电路 原码 二进制表示 二进制首位是符号位 0 为正 1 为负 反码 正数 反码和原码一样 负数 符号位不变 其他各位取反 补码 正数 补码和原码一样 负数 反码末位加 1 有进位则进位 但不改变符号位二 举个例子 假设是字节长度为 8 位 正数 1

    2026年3月17日
    2
  • 一些有意思的 GitHub 项目

    一些有意思的 GitHub 项目GitFiti常用GitHub的同学应该知道GitHub的提交日历,每日提交的次数越多,颜色越深,于是有人写了此项目,可以自动根据配置提交不同次数的日志,这样即可画出指定的图案。看来程序员的脑洞也非常大啊!GitHub地址:https://github.com/gelstudios/gitfitiNoCode正如标题所示,“NoCode”,其作者是来…

    2022年7月16日
    17
  • java基础必背知识点

    java基础必背知识点文章目录 day01 前言 入门程序 常量 变量 1 Java 程序开发三步骤 2 6 种类型的常量常量常量的分类 3 8 种基本数据类型的变量变量格式注意事项 day02 数据类型转换 运算符 方法入门 1 强制转换注意事项 2 ASCII 编码表 3 运算符 4 三元运算符 day03 流程控制语句 1 判断语句 if elseif else2 选择语句 switch 注意事项 3

    2026年3月17日
    1
  • UpdatePanel简单用法

    UpdatePanel简单用法ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是设置页面中异步局部更新区域,它必须依赖于ScriptManager存在,因为ScriptManger控件提供了客户端脚本生成与管理UpdatePanel的功能。几个重要的属性:   ScriptManager控件的EnablePartialRendering属性:t

    2022年7月23日
    13
  • Deepseek完整教程:开发者与企业必学的深度检索指南

    Deepseek完整教程:开发者与企业必学的深度检索指南

    2026年3月12日
    1
  • eclipse添加logcat显示_eclipse的logcat不见了

    今天打开eclipse调了一会程序,突然发现logcat不见了,只有Console等,找了半天没找到,最后还是苦命的发现了,如下.Window ……Show View……Other…会出现如下对话框:选择LogCat后,eclipse就能正常查看LogCat的输出了。

    2022年3月9日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号