Spring Boot Starters是什么?

Spring Boot Starters是什么?版权声明 该文转自 http www nosuchfield com 2017 10 15 Spring Boot Starters 版权归原创作者 在此对原作者的付出表示感谢 starter 是 SpringBoot 中的一个新发明 它有效的降低了项目开发过程的复杂程度 对于简化开发操作有着非常好的效果 本文转载了一片文章 详细介绍了 springbootst 是什么 它的作用

版权声明:该文转自: http://www.nosuchfield.com/2017/10/15/Spring-Boot-Starters/。版权归原创作者,在此对原作者的付出表示感谢!

  starter是SpringBoot中的一个新发明,它有效的降低了项目开发过程的复杂程度,对于简化开发操作有着非常好的效果。本文转载了一片文章,详细介绍了spring boot stater是什么?它的作用是什么?

  Spring Boot Starter是在SpringBoot组件中被提出来的一种概念,stackoverflow上面已经有人概括了这个starter是什么东西,想看完整的回答戳这里(https://stackoverflow.com/questions//what-are-spring-boot-starter-jars/#)

Spring Boot Starters是什么?

  大概意思就是说starter是一种对依赖的synthesize(合成),这是什么意思呢?我可以举个例子来说明。

    传统的做法

  在没有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是为了解决不同的依赖,所以它们内部的实现可能会有很大的差异,例如jpa的starter和Redis的starter可能实现就不一样,这是因为starter的本质在于synthesize,这是一层在逻辑层面的抽象,也许这种理念有点类似于Docker,因为它们都是在做一个“包装”的操作,如果你知道Docker是为了解决什么问题的,也许你可以用Docker和starter做一个类比。

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

  starter的整体逻辑:

Spring Boot Starters是什么?

  上面的starter依赖的jar和我们自己手动配置的时候依赖的jar并没有什么不同,所以我们可以认为starter其实是把这一些繁琐的配置操作交给了自己,而把简单交给了用户。除了帮助用户去除了繁琐的构建操作,在“约定大于配置”的理念下,ConfigurationProperties还帮助用户减少了无谓的配置操作。并且因为 application.properties 文件的存在,即使需要自定义配置,所有的配置也只需要在一个文件中进行,使用起来非常方便。

  了解了starter其实就是帮助用户简化了配置的操作之后,要理解starter和被配置了starter的组件之间并不是竞争关系,而是辅助关系,即我们可以给一个组件创建一个starter来让最终用户在使用这个组件的时候更加的简单方便。基于这种理念,我们可以给任意一个现有的组件创建一个starter来让别人在使用这个组件的时候更加的简单方便,事实上Spring Boot团队已经帮助现有大部分的流行的组件创建好了它们的starter,你可以在这里查看这些starter的列表。

  创建自己的Spring Boot Starter

  如果你想要自己创建一个starter,那么基本上包含以下几步

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

  我们来看一个例子(例子的完整代码位于https://github.com/RitterHou/learn-spring-boot-starter

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

 1  
    xml version="1.0" encoding="UTF-8"?>  2 <project xmlns="http://maven.apache.org/POM/4.0.0"  3  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  4  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  5 <modelVersion>4.0.0 
     modelVersion>  6 <artifactId>http-starter 
      artifactId>  7 <version>0.0.1-SNAPSHOT 
       version>  8  9  
         10  
         11 <parent> 12 <groupId>org.springframework.boot 
        groupId> 13 <artifactId>spring-boot-starters 
         artifactId> 14 <version>1.5.2.RELEASE 
          version> 15  
           parent> 16 17 <dependencies> 18  
             19 <dependency> 20 <groupId>org.springframework.boot 
            groupId> 21 <artifactId>spring-boot-starter 
             artifactId> 22  
              dependency> 23  
                24 <dependency> 25 <groupId>org.projectlombok 
               groupId> 26 <artifactId>lombok 
                artifactId> 27 <version>1.16.10 
                 version> 28  
                  dependency> 29  
                   dependencies> 30 31  
                    project>

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

 

1 @ConfigurationProperties(prefix = "http") // 自动获取配置文件中前缀为http的属性,把值传入对象参数 2 @Setter 3 @Getter 4 public class HttpProperties { 5 6  // 如果配置文件中配置了http.url属性,则该默认属性会被覆盖 7  private String url = "http://www.baidu.com/"; 8 9 }

  上面这个类就是定义了一个属性,其默认值是 http://www.baidu.com/,我们可以通过在 application.properties中添加配置 http.url=https://www.zhihu.com 来覆盖参数的值。

  创建业务类:

 

 1 @Setter  2 @Getter  3 public class HttpClient {  4  5 private String url;  6  7 // 根据url获取网页数据  8 public String getHtml() {  9 try { 10 URL url = new URL(this.url); 11 URLConnection urlConnection = url.openConnection(); 12 BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8")); 13 String line = null; 14 StringBuilder sb = new StringBuilder(); 15 while ((line = br.readLine()) != null) { 16 sb.append(line).append("\n"); 17  } 18 return sb.toString(); 19 } catch (Exception e) { 20  e.printStackTrace(); 21  } 22 return "error"; 23  } 24 25 }

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

  创建AutoConfiguration

 1 @Configuration  2 @EnableConfigurationProperties(HttpProperties.class)  3 public class HttpAutoConfiguration {  4  5  @Resource  6 private HttpProperties properties; // 使用配置  7  8 // 在Spring上下文中创建一个对象  9  @Bean 10  @ConditionalOnMissingBean 11 public HttpClient init() { 12 HttpClient client = new HttpClient(); 13 14 String url = properties.getUrl(); 15  client.setUrl(url); 16 return client; 17  } 18 19 }

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

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

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

 1 @Component  2 public class RunIt {  3  4  @Resource  5 private HttpClient httpClient;  6  7 public void hello() {  8  System.out.println(httpClient.getHtml());  9  } 10 11 }

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

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

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

转载于:https://www.cnblogs.com/tjudzj/p/8758391.html

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

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

(0)
上一篇 2026年3月18日 下午10:44
下一篇 2026年3月18日 下午10:44


相关推荐

  • 腾讯云免费ssl证书有几个_腾讯云ssl

    腾讯云免费ssl证书有几个_腾讯云ssl腾讯云免费SSL证书腾讯云免费证书是由亚洲诚信(TrustAsia)提供的,由Digicert根证书签发。域名类型单域名,证书有效期为1年。限制同一主域最多只能申请20张。一级域名及其子域名均属于同一主域。如果超过此限制可以到其他平台申请免费的证书。如果需要免费的泛域名证书或多域名证书,可以了解一下来此加密。来此加密:提供免费的泛域名证书,多域名证书,可自动验证,自动续签。SDSDS腾讯云免费SSL证书限制…

    2025年10月16日
    4
  • 阻容降压电路计算

    阻容降压电路计算阻容降压电路正确计算将交流市电转换为低压直流的常规方法是采用变压器降压后再整流滤波,当受体积和成本等因素的限制时,最简单实用的方法采用电容降压式电源。上图内容引用网上的。   /****************非常规算法,待验证**********************************/ 看到这里,很多朋友一定想说:不就是阻容么,计算容抗然后电压除以容抗不就成了

    2022年6月20日
    41
  • WindowsAPI 之 CreatePipe、CreateProcess[通俗易懂]

    WindowsAPI 之 CreatePipe、CreateProcess[通俗易懂]MSDN介绍CreatePipeApipeisasectionofsharedmemorythatprocessesuseforcommunication.Theproce

    2022年7月1日
    28
  • XMind 快捷键完整命令

    XMind 快捷键完整命令xmind快捷键XMind快捷键完整命令快捷键(Windows)快捷键(Mac)描述++展开当前分支–收缩当前分支**展开所有分支//收缩所有分支Alt±Alt±显示系统菜单Alt+/Alt±内容辅助Alt+?Alt±上下文信息Alt+向上箭头Alt+向上箭头向前移动主题Alt+向下箭头Alt+向下箭头向后移动主题Alt+向左箭头Alt+向左箭头向左移动主题Alt+向右箭头A

    2022年5月3日
    64
  • OpenClaw(小龙虾)接入本地模型失败

    OpenClaw(小龙虾)接入本地模型失败

    2026年3月15日
    2
  • idea2020最新版如何部署多个jdk

    idea2020最新版如何部署多个jdk

    idea 2021年10月3日
    82

发表回复

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

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