一、背景介绍

我们在使用Spring Cloud全家桶构建微服务应用时,经常能看到spring-boot-xxx-starter的依赖,像spring-boot-starter-web、spring-cloud-starter-feign、spring-boot-starter-test、mybatis-spring-boot-starter,仿佛只要带上starter的东西,你就拥有了这个组件的一切,包括所有的配置,引用类都搞定了,这样一个神奇的拿来就用的东西,是怎么实现的呢?我们自己能不能把自己的工具包做成一个starter?

二、Spring Boot Starter组件规范

  • 命名规范

groupId:这个标签的命名没做太多要求,基本上使用公司域名+项目名方式,如官方一般使用org.springframework.cloud,第三方一般用自己公司域名,如org.mybatis.spring.boot。

artifactId:这个标签的命名Spring官方给了建议命名方式,Spring官方自己发布的组件,命名方式是spring-boot-starter-xxx,xxx表示组件名称,像上文提及的spring-boot-starter-web和spring-cloud-starter-feign;第三方开发的组件,命名方式是xxx-spring-boot-starter,如mybatis-spring-boot-starter。

  • 工程规范

以maven工程为例,Spring Boot Starter用多模块方式建立工程,工程内有autoconfigure模块和starter模块。

autoconfigure模块为自动配置模块,里面包含配置加载,全部的功能代码实现及需要引用的jar包,负责对内功能实现,所有的代码开发都在这个模块中完成。

starter模块提供自动配置模块的依赖,里面没有代码,是个空jar包,只有对autoconfigure模块的所有引用,是一个依赖集,它的目的是简化使用该组件时的依赖,只要添加starter模块,就能使用整个starter组件。

三、案例实战

我们以常用的RocketMQ客户端组件为例,搭建一个自己定义的starter,RocketMQ是由阿里巴巴团队开发并捐赠给apache团队的优秀消息中间件,承受过历年双十一大促的考验。

  1. 创建一个Maven工程,增加两个模块rocketmq-spring-boot-autoconfigure和rocketmq-spring-boot-starter,这里使用的RocketMQ版本为4.5.2,主pom.xml节选如下:
  1. <groupId>com.hy.demo</groupId>
  2. <artifactId>rocketmq</artifactId>
  3. <packaging>pom</packaging>
  4. <version>1.0-SNAPSHOT</version>
  5. <modules>
  6. <module>rocketmq-spring-boot-autoconfigure</module>
  7. <module>rocketmq-spring-boot-starter</module>
  8. </modules>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.apache.commons</groupId>
  12. <artifactId>commons-lang3</artifactId>
  13. <version>3.3.2</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.apache.rocketmq</groupId>
  17. <artifactId>rocketmq-client</artifactId>
  18. <version>4.5.2</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.projectlombok</groupId>
  22. <artifactId>lombok</artifactId>
  23. <scope>provided</scope>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework</groupId>
  27. <artifactId>spring-context</artifactId>
  28. <version>5.1.8.RELEASE</version>
  29. <scope>compile</scope>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.slf4j</groupId>
  33. <artifactId>slf4j-api</artifactId>
  34. </dependency>
  35. </dependencies>
  1. autoconfigure模块开发

    src目录下添加相应的工具类,如注解,配置类,接口等,略

    添加定位配置侯选类,在META-INF/目录下新建spring.factories文件:
  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.hy.demo.rocketmq.MQConfig

Spring Boot会检查你发布的jar中是否存在META-INF/spring.factories文件,自动配置类只能通过这种方式加载

  1. starter模块开发

    只需要修改pom.xml文件即可:
  1. <parent>
  2. <artifactId>rocketmq</artifactId>
  3. <groupId>com.hy.demo</groupId>
  4. <version>1.0-SNAPSHOT</version>
  5. </parent>
  6. <modelVersion>4.0.0</modelVersion>
  7. <artifactId>rocketmq-spring-boot-starter</artifactId>
  8. <dependencyManagement>
  9. <dependencies>
  10. <dependency>
  11. <groupId>com.hy.demo</groupId>
  12. <artifactId>rocketmq</artifactId>
  13. <version>1.0-SNAPSHOT</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. </dependencies>
  18. </dependencyManagement>
  19. <dependencies>
  20. <dependency>
  21. <groupId>com.hy.demo</groupId>
  22. <artifactId>rocketmq-spring-boot-autoconfigure</artifactId>
  23. <version>1.0-SNAPSHOT</version>
  24. </dependency>
  25. </dependencies>

在IDEA上对该工程进行编译,打包,命令:

clean install -DskipTests=true

4、打包部署完成后,在应用模块里添加该starter的依赖即可

  1. <dependency>
  2. <groupId>com.hy.demo</groupId>
  3. <artifactId>rocketmq-spring-boot-starter</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. </dependency>

注:因为RocketMQ组件较为通用,目前提供基本的几种发送和接收消息的方式,支持事务消息,文章内就不一一解释代码功能,附上此次源码地址:

rocketmq-spring-boot-starter源码示例

四、知识点梳理

  1. Spring的几个注解:

    @Import用来整合所有在@Configuration注解中定义的Bean配置;

    @EventListener 事件监听,里面写的ContextStartedEvent,表示监听Spring上下文启动完成后的事件;

    @Configuration相当于xml的beans标签;

    @Bean标注在方法上,等同于xml的bean;

  2. 自定义注解@MQConsumer和注解@MQTransactionProducer是如何起作用的?

    工程里定义了com.hy.demo.rocketmq.config.RocketMQAnnotationScan类对这两个注解进行扫描,利用注解@EventListener(ContextStartedEvent.class),监听Spring上下文初始化事件,然后从Spring容器内读取所有带这两个注解的类,把RocketMQ相关的配置信息加载进去,由于事务消息生产者类org.apache.rocketmq.client.producer.TransactionMQProducer的特殊性(它需要在初始化时注入TransactionListener监听类,与应用模块有一定耦合性),所以增加了一个Map集合存储应用模块内所有使用了@MQTransactionProducer注解的实例。

    专注Java高并发、分布式架构,更多技术干货分享与心得,请关注公众号:Java架构社区

使用Spring-boot-starter标准改造项目内的RocketMQ客户端组件的更多相关文章

  1. 手把手教你定制标准Spring Boot starter,真的很清晰

    写在前面 我们每次构建一个 Spring 应用程序时,我们都不希望从头开始实现具有「横切关注点」的内容:相反,我们希望一次性实现这些功能,并根据需要将它们包含到任何我们要构建的应用程序中 横切关注点 ...

  2. [转] 使用Spring Boot和Gradle创建项目

    Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 ...

  3. 从零开始开发一个Spring Boot Starter

    一.Spring Boot Starter简介 Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件 ...

  4. 最详细的自定义Spring Boot Starter开发教程

    1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...

  5. 手把手教你手写一个最简单的 Spring Boot Starter

    欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...

  6. Github点赞超多的Spring Boot学习教程+实战项目推荐!

    Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐!   很明显的一个现象,除了一些老项目,现在 Java 后端项目基本都是基于 Spring Boot 进行开发,毕竟它这 ...

  7. Spring Boot Starter 和 ABP Module

    Spring Boot 和 ABP 都是模块化的系统,分别是Java 和.NET 可以对比的框架.模块系统是就像乐高玩具一样,一块一块零散积木堆积起一个精彩的世界.每种积木的形状各不相同,功能各不相同 ...

  8. Spring Boot Starter 介绍

    http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...

  9. spring -boot s-tarter 详解

    Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...

随机推荐

  1. 手工释放服务器的swap分区缓存

    时间     恢复时间 状态 信息 主机 问题 • 严重性 持续时间 确认 动作 2019-03-21 20:29:30     09:51:30     -ai-代理 Lack of free sw ...

  2. 理解Yarn的执行流程和组件作用

    Yarn引入案例 1.学生找院长报到,院长给学生一个学号 2.院长比较忙,继续找主任处理学生事务 3.系主任找院办给学生分配资源(书本) 4.主任找张老师教授java 5.张老师给学生安排座位 6.学 ...

  3. SpringDataJpa——JpaRepository查询功能(转)

    1.JpaRepository支持接口规范方法名查询.意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现,目前支持的关键字如下. Keyword Sample JPQL snippet ...

  4. 【学习笔记】python3核心技术与实践--开篇词

    python的应用和流行程度: Python 可以运用在数据处理.Web 开发.人工智能等多个领域,它的语言简洁.开发效率高.可移植性强,并且可以和其他编程语言(比如 C++)轻松无缝衔接.现如今,不 ...

  5. ubuntu16.04查看opencv版本

    查看opencv版本:pkg-config opencv --modversion

  6. 05:videoToolbox:硬解码

    videoToolbox:硬解码 前言:VTDecompressionSession 工作流程: 1:创建解压的会话. 2:配置会话属性. 3:解压视频帧数据. 4:释放会话.释放资源. 介绍  VT ...

  7. [C++] 头文件中的#ifndef,#define,#endif以及#pragma用法

    想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文 ...

  8. MAC中Composer的使用

    安装composer 安装前需确保系统PHP版本在5.3以上,在终端中执行以下命令下载Composer可执行文件: curl -sS https://getcomposer.org/installer ...

  9. 【linux】【jenkins】自动化部署一 安装jenkins及Jenkins工作目录迁移

    系统环境:Centos7 https://jenkins.io/zh/download/ 下载对应系统的jenkins 一.安装jdk8.0 jenkins安装需要jdk8or11,根据jenkins ...

  10. mysql--命令行创建数据库

    MySQL 1. 连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root  -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格 ...