如何使用SpringBoot写一个属于自己的Starter

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: SpringBoot以其自动装配的能力被广泛应用,我们在写代码时肯定遇到过很多spring-boot-starter命名的依赖,比如spring-boot-starter-web,在pom文件中引入这些starter依赖后,SpringBoot就能通过自动装配的技术扫描到这些类并装载到Bean容器中。

(一)概述


SpringBoot以其自动装配的能力被广泛应用,我们在写代码时肯定遇到过很多spring-boot-starter命名的依赖,比如spring-boot-starter-web,在pom文件中引入这些starter依赖后,SpringBoot就能通过自动装配的技术扫描到这些类并装载到Bean容器中。


除了SpringBoot官方的这些Starter外,我们自己也可以开发Starter。为了和官方的starter区分,建议自定义的starter命名格式为xxxx-spring-boot-starter,比如mybatis-spring-boot-starter。


本文将介绍如何自己实现一个starter。


(二)看个例子


在写自己的Starter之前,很有必要看一下别人是怎样去写的。这里拿

RedisAutoConfiguration这个类作为例子。


SpringBoot在启动时会通过自动装配去扫描项目MATA-INF/spring.factories文件,这个文件中定义了所有需要去自动装配的类。Redis的自动装配类就是下图的RedisAutoConfiguration。


网络异常,图片无法展示
|


进入 RedisAutoConfiguration后,首先看最重要的几个注解,@Configuration不用多提了,@ConditionalOnClass表示当这个注解后面的类存在时,该Bean才会被加载。下图中很明显RedisOperations并不存在,所以Redis不会被自动装配进去。


网络异常,图片无法展示
|


@EnableConfigurationProperties用于自动加载配置类的信息,配置类和我们平常写的基本一样,通过ConfigurationProperties读取properties或者yaml中的配置信息。


网络异常,图片无法展示
|


RedisAutoConfiguration这个类中定义的Bean有两个,我们应该都比较熟悉。

@ConditionalOnMissingBean的意思是当Spring容器中不存在这个Bean的时候,才会加载这个Bean,所以如果我们在代码中自己定义了redisTemplate之后,注入到Bean容器中的就是我们自己写的那个Bean。


网络异常,图片无法展示
|


看到这里基本已经知道一个Starter的实现方案了,接下来就写一个简单的Starter。

(三)实现信息播报Starter


要做的这个Starter其实很简单,就是输出配置文件中配置的信息。


首先新建一个Maven项目,在项目中新建两个Module,我给两个项目分别命名为report-spring-boot-starter和example-spring-boot

首先介绍report-spring-boot-starter,这是一个Starter,主要实现输出一些内容的功能,我们可以完全按照RedisAutoConfiguration去写。首先新建自动装配类:ReportAutoConfiguration


@Configuration@ConditionalOnClass(ReportOperation.class)
@EnableConfigurationProperties(ReportProperties.class)
publicclassReportAutoConfiguration {
@BeanpublicReportOperationreportOperation(ReportPropertiesreportProperties){
ReportOperationreportOperation=newReportOperation(reportProperties.getMsg());
returnreportOperation;
    }
}

当ReportOperation存在时才会加载该配置,激活配置文件ReportProperties

publicclassReportOperation {
privateStringmsg;
publicReportOperation(Stringmsg){
this.msg=msg;
    }
publicStringgetMsg() {
returnmsg;
    }
publicvoidsetMsg(Stringmsg) {
this.msg=msg;
    }
publicStringreport(){
returnmsg;
    }
}

ReportProperties如下:

@ConfigurationProperties(prefix="report")
publicclassReportProperties {
privateStringmsg;
publicvoidsetMsg(Stringmsg) {
this.msg=msg;
    }
publicStringgetMsg() {
returnmsg;
    }
}

接下来是实现自动注入的关键,前面已经说到了,SpringBoot会去扫描依赖Jar包中META-INF/spring.factories中的内容,因此在resources目录下新建META-INF/spring.factories,写下配置信息:


org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.javayz.starter.ReportAutoConfiguration

这样一个简单的Starter就完成了。


(四)调用这个Starter


接下来在example-spring-boot这个module中调用上面的starter,首先第一步引入相关依赖,这里只需要引入springboot相关依赖和自己写的starter依赖即可:


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.example</groupId><artifactId>report-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>

接着写一个测试的controller测试自动注入的效果:

@RestControllerpublicclassTestController {
@AutowiredprivateReportOperationreportOperation;
@GetMapping("test")
publicStringtest(){
System.out.println(reportOperation.getMsg());
returnreportOperation.getMsg();
    }
}

在配置文件中增加一条配置:

report.msg=hello

运行项目调用接口,可以发现ReportOperation这个Bean已经被自动注入了。


(五)总结


本文结合redis自动注入的例子,写了一个属于自己的Starter,希望对大家有所帮助。我是鱼仔,我们下期再见!

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
Java Spring
Springboot starter开发之traceId请求日志链路追踪
能标识一次请求的完整流程,包括日志打印、响应标识等,以便于出现问题可以快速定位并解决问题。
1599 0
Springboot starter开发之traceId请求日志链路追踪
|
消息中间件 IDE Java
|
XML Java 程序员
保姆级教程,手把手教你实现SpringBoot自定义starter
保姆级教程,手把手教你实现SpringBoot自定义starter
5647 0
保姆级教程,手把手教你实现SpringBoot自定义starter
|
SpringCloudAlibaba NoSQL Java
1.1 w字,18 张图,彻底说透 springboot starter 机制
1.1 w字,18 张图,彻底说透 springboot starter 机制
654 1
1.1 w字,18 张图,彻底说透 springboot starter 机制
|
NoSQL Java Redis
如何自定义一个SpringBoot中的starter
如何自定义一个SpringBoot中的starter
176 0
如何自定义一个SpringBoot中的starter
|
Java 程序员 网络安全
自定义spring boot starter三部曲之二:实战开发
《自定义spring boot starter三部曲》的第二篇,开始编码实战,开发并使用starter库
261 0
自定义spring boot starter三部曲之二:实战开发
|
Java 程序员 Maven
自定义spring boot starter三部曲之一:准备工作
从本章开始,一起实战一个自定义的spring boot starter,整个系列共三篇文章,本篇是开篇,咱们一起先了解基本概念、规划实战内容,为整个系列做好准备
208 0
自定义spring boot starter三部曲之一:准备工作
|
NoSQL Java 应用服务中间件
SpringBoot项目为什么需要引入大量的starter?如何自定义starter?
为什么我们在使用SpringBoot框架开发Java Web应用需要引入大量的starter?例如,我们引入Redis就在Maven中导入spring-boot-starter-data-redis。大家都知道SpringBoot的核心功能是自动装配,简化配置,我们通过starter实现SpringBoot自动装配的功能。那么我们如何去构建自己的starter呢?
270 0
|
Java 程序员 开发者
自定义spring boot starter三部曲之三:源码分析spring.factories加载过程
分析Spring和Spring boot源码,了解spring.factories自动加载原理
299 0
自定义spring boot starter三部曲之三:源码分析spring.factories加载过程
|
监控 Java 应用服务中间件
SpringBoot——四大核心之起步依赖(自定义starter)
这篇文章呢,我来和大家聊聊起步依赖这个东西。
1027 0
SpringBoot——四大核心之起步依赖(自定义starter)