写点什么

自定义 spring boot starter 三部曲之一:准备工作

作者:程序员欣宸
  • 2022 年 7 月 13 日
  • 本文字数:2108 字

    阅读完需:约 7 分钟

自定义spring boot starter三部曲之一:准备工作

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


  • 从本章开始,一起实战一个自定义的 spring boot starter,整个系列共三篇文章,内容如下:


  1. 准备:了解基本概念、规划实战内容;

  2. 实战:开发自定义 starter,并在 demo 工程中使用它;

  3. 深入:从 spring 和 spring boot 源码层面分析 starter 的原理;

本章内容概览

  1. 查看官方资料;

  2. 设定实战目标;

  3. 学习 spring cloud 的 starter,作为实战参考;

  4. 实战内容的具体设计;

版本信息

  • 本次实战的版本信息:


  1. java:1.8.0_144

  2. spring boot:1.5.16.RELEASE

  3. spring cloud:Edgware.RELEASE

官方资料

  • 为了有个初始印象,我们从 spring 官方文档看起吧:

  • 官网:https://spring.io/docs/reference ,点击下图红框位置:



  • 在弹出的列表中选择 1.5.16 版本的 reference,如下图红框:



  • 在打开的文档目录中很容易找到 starter 的章节,地址是:https://docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/htmlsingle/#using-boot-starter ,内容如下图:



  • 我的理解:

  • 第一. 在应用中可以用 starter 将依赖库问题变得简单,如果你想依赖 Spring 和 JPA,只需在应用中依赖 spring-boot-starter-data-jpa 即可;

  • 第二. 常用库的官方 starter,其 artifactId 的格式类似"spring-boot-starter-*", 对于非官方的 starter,建议将业务名称放在"spring-boot-starter"前面,例如"acme-spring-boot-starter";

  • 第三. 已列举常用的官方 starter,可用来参考;

设定实战目标

  • 本次实战的目标如下:


  1. A 应用提供加法计算的服务;

  2. B 应用提供减法计算的服务;

  3. C 应用要使用加法计算和减法计算的服务,并且减法服务可以通过配置来实现是否支持负数;

学习 spring cloud 的 starter

  • 目标已定下,但是先不急着编码,我们去看下 spring cloud 的设计,用来作为借鉴参考;

  • 回顾一下我们使用 Spring cloud 的时候,如果要把一个应用作为 Eureka client 注册到 Eureka server,只需在应用的 pom.xml 中添加如下依赖:


<dependency>  <groupId>org.springframework.cloud</groupId>  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
复制代码


  • 注册到 Eureka server 的工作,是由 CloudEurekaClient 类完成的,该类属于模块 spring-cloud-netflix-eureka-client,因此我们要弄清楚以下两点:


  1. 为什么不需要应用的 pom.xml 中依赖 spring-cloud-netflix-eureka-client?

  2. 为什么应用能自动注册到 Eureka sever?

如何建立对 spring-cloud-netflix-eureka-client 模块的依赖

  • 打开 spring-cloud-starter-netflix-eureka-client 模块的 pom.xml 文件就一目了然了,如下图,原来在这个 pom.xml 文件中已经依赖了 spring-cloud-netflix-eureka-client 模块,因此,我们的应用只需依赖 spring-cloud-starter-netflix-eureka-client 模块,就能间接依赖到 spring-cloud-netflix-eureka-client 模块:



  • 再看看上图中其他的依赖,可以发现的确如官方文档所说,starter 处理了复杂的依赖关系,我们只需要依赖 starter 即可,官方文档中还有一段话需要注意,如下图:



  • 上图红框中说明 starter 是个空的 jar,其作用就是用来提供必要的模块依赖的,来看看 spring-cloud-starter-netflix-eureka-client 模块是否遵守此规则,如下图,只有配置文件,没有任何 class:


为什么应用能自动注册到 Eureka sever

  • 作为 Eureka client 的应用,在启动后就自动注册到 Eureka server 了,作为应用开发者的我们除了在 pom.xml 中依赖 spring-cloud-starter-netflix-eureka-client 模块,没有做其他设置,这是如何实现的呢?

  • 注册到 Eureka server 的工作,是 CloudEurekaClient 类在其父类的构造方法中完成的,搜索源码发现此类的在 EurekaClientAutoConfiguration 中被注册到 spring 容器,如下图红框所示:



  • 所以,现在问题就变成了如何让 EurekaClientAutoConfiguration 类被实例化?

  • 在 spring-cloud-netflix-eureka-client 模块的 spring.factories 文件中,找到了 EurekaClientAutoConfiguration:



  • 这是个 spring boot 的扩展配置,在此文件中配置的 bean 都会被实例化,然后注册到 spring 容器,具体的细节,我们会在第三章结合 spring boot 源码详细分析,本章只要知道用法即可;

  • 此处小结 Eureka client 自动注册到 Eureka server 的过程:

  • 第一、spring-cloud-netflix-eureka-client 模块的 spring.factories 文件中配置了 EurekaClientAutoConfiguration,因此 EurekaClientAutoConfiguration 会被实例化并注册到 Spring 容器中;

  • 第二、EurekaClientAutoConfiguration 中配置了 CloudEurekaClient,因此 CloudEurekaClient 会实例化,在构造方法中执行了注册;

实战的设计

  • 参考了 spring cloud 的 starter 设计后,接下来的实战被设计成两个 maven 工程:customizestarter 和 customizestartertestdemo;

  • 工程 customizestarter 里面包含了四个模块,每个模块功能如下所示:


  • 工程 customizestartertestdemo 在 pom.xml 中依赖了上述的 customizeservicestarter 模块,提供的 web 服务会用到 addservice 和 minusservice 的服务,并且在应用启动时设置环境变量来选择使用的减法服务是否支持负数;

  • 至此,准备工作已经完成了,对基本原理和开发设计都已经清楚,接下来的章节我们来一起开发上述五个工程;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 刚刚阅读数: 4
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
自定义spring boot starter三部曲之一:准备工作_spring_程序员欣宸_InfoQ写作社区