当前位置: 首页 > news >正文

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

(一)概述

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)
public class ReportAutoConfiguration {
    @Bean
    public ReportOperation reportOperation(ReportProperties reportProperties){
        ReportOperation reportOperation = new ReportOperation(reportProperties.getMsg());
        return  reportOperation;
    }
}

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

public class ReportOperation {
    private String msg;
    public ReportOperation(String msg){
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String report(){
        return msg;
    }
}

ReportProperties如下:

@ConfigurationProperties(prefix = "report")
public class ReportProperties {
    private String msg;

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }
}

接下来是实现自动注入的关键,前面已经说到了,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测试自动注入的效果:

@RestController
public class TestController {
    @Autowired
    private ReportOperation reportOperation;

    @GetMapping("test")
    public String test(){
        System.out.println(reportOperation.getMsg());
        return reportOperation.getMsg();
    }
}

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

report.msg = hello

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

(五)总结

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

相关文章:

  • C# 常用正责表达式
  • 【设计模式】快速理解建造者模式,及其在JDK源码中的应用
  • RMQ
  • 简单聊聊MySQL中的六种日志
  • 网络 基于TCP协议socket编程
  • 最实用的设计模式:策略模式的快速理解
  • Spark算子实战Java版,学到了
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 【设计模式】快速理解装饰者模式,及其在JDK源码中的应用
  • 你真的了解Maven吗?
  • 【转】Xcode常用快捷键与技巧分享
  • 【设计模式】快速理解观察者模式,原来它还有这么多其他名字
  • linux实际应用小技巧
  • 时间类有多复杂,JDK竟设计了三版
  • AOP之PostSharp5-LocationInterceptionAspect
  • Angular4 模板式表单用法以及验证
  • axios请求、和返回数据拦截,统一请求报错提示_012
  •  D - 粉碎叛乱F - 其他起义
  • eclipse(luna)创建web工程
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Laravel5.4 Queues队列学习
  • nginx 负载服务器优化
  • Promise初体验
  • SpringBoot 实战 (三) | 配置文件详解
  • SSH 免密登录
  • vue 个人积累(使用工具,组件)
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端存储 - localStorage
  • 微信小程序开发问题汇总
  • 原生js练习题---第五课
  • 阿里云重庆大学大数据训练营落地分享
  • 积累各种好的链接
  • ​Python 3 新特性:类型注解
  • !!Dom4j 学习笔记
  • "无招胜有招"nbsp;史上最全的互…
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (30)数组元素和与数字和的绝对差
  • (Java数据结构)ArrayList
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .Net 4.0并行库实用性演练
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net中调用windows performance记录性能信息
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [hive] sql中distinct的用法和注意事项
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • [JDBC-1] JDBC Base Template