如何自定义一个SpringBoot中的starter

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 如何自定义一个SpringBoot中的starter

 引入

       我们都知道SpringBoot的核心就是自动装配原理,对于自动装配的原理进行分析之后,我们可以基于这个机制来实现一个Starter组件,以便加深大家对自动装配及Starter组件的理解。同时,Spring Boot官方提供的Starter并不能囊括所有的技术组件,在工作中,如果自己的项目需要支持Spring Boot,也需要开发Starter组件。

概述

从Spring Boot官方提供的Starter的作用来看,Starter组件主要有三个功能:

(1)涉及相关组件的Jar包依赖;

(2)自动实现Bean的装配;

(3)自动声明并且加载application.properties文件中的属性配置。

规范

Starter的命名规范

Starter的命名主要分为两类,一类是官方命名,另一类是自定义组件命名。这种命名格式并不是强制性的,也是一种约定俗成的方式,可以让开发者更容易识别。

       (1)官方命名的格式为:spring-boot-starter-模块名称,比如spring-boot-starter-web;

       (2)自定义命名格式为:模块名称-spring-boot-starter,比如mybatis-spring-boot-starter。

简单来说,官方命名中模块名放在最后,而自定义组件中模块名放在最前面。

实例

虽然Spring Boot官方提供了spring-boot-starter-data-redis 组件来实现 RedisTemplate 的自动装配,但是在这里就着为了演示目的去如何实现一个基于Redis简化版本的Starter组件。

步骤

(1)创建一个工程,命名为redis-spring-boot-starter。

image.gif编辑

(2)添加Jar包依赖。

说明:Redisson提供了在Java中操作Redis的功能,并且基于Redis的特性封装了很多可直接使用的场景,比如分布式锁。

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.11.1</version>
</dependency>

image.gif

(3)定义属性类,实现在application.properties中配置Redis的连接参数。

说明:由于只是一个简单版本的Demo,所以只简单定义了一些必要参数。另外@ConfigurationProperties这个注解的作用是把当前类中的属性和配置文件( properties/yaml )中的配置进行绑定,并且前缀是banq.redisson。

@ConfigurationProperties(prefix ="banq.redisson")
public class RedissonProperties {
    private String host = "localhost";
    private String password;
    private int port = 6379;
    private int timeout;
    private boolean ssl;
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getPort() {
        return port;
    }
    public void setPort(int port) {
        this.port = port;
    }
    public int getTimeout() {
        return timeout;
    }
    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }
    public boolean isSsl() {
        return ssl;
    }
    public void setSsl(boolean ssl) {
        this.ssl = ssl;
    }
}

image.gif

(4)定义需要自动装配的配置类,主要就是把RedissonClient装配到IoC容器。

说明:@ConditionalOnClass,它表示一个条件,在当前场景中表示的是∶在classpath下存在Redisson这个类的时候,RedissonAutoConfiguration才会实现自动装配。另外,这里只演示了一种单机的配置模式,除此之外,Redisson还支持集群、主从、哨兵等模式的配置,大家有兴趣的话可以基于当前案例去扩展,建议使用config.fromYAML方式,直接加载配置完成不同模式的初始化,这会比根据不同模式的判断来实现配置化的方式更加简单。

@Configuration
@ConditionalOnClass(Redisson.class)
@EnableConfigurationProperties(RedissonProperties.class)
public class RedissonAutoConfiguration {
    @Bean
    RedissonClient redissonClient(RedissonProperties redissonProperties){
        Config config = new Config();
        String prefix = "redis://";
        if (redissonProperties.isSsl()) {
            prefix = "rediss://";
        }
        SingleServerConfig singleServerConfig = config.useSingleServer()
                .setAddress(prefix + redissonProperties.getHost() + ":" + redissonProperties.getPort())
                .setConnectTimeout(redissonProperties.getTimeout());
        if (!StringUtil.isEmpty(redissonProperties.getPassword())) {
            singleServerConfig.setPassword(redissonProperties.getPassword());
        }
        return Redisson.create(config);
    }
}

image.gif

(5)在resources下创建META-INF/spring.factories文件。

说明:使得Spring Boot程序可以扫描到该文件完成自动装配。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=ink.banq.RedissonAutoConfiguration

image.gif

(6)使用Maven的install命令把项目打包成jar。

image.gif编辑

(7)在项目中使用:

image.gif编辑

添加Starter依赖

<dependency>
    <groupId>ink.banq</groupId>
    <artifactId>redis-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

image.gif

设置属性配置

说明:在application.properties中配置host和port,这个属性会自动绑定到RedissonProperties中定义的属性上。

banq.redission.host = IP地址
banq.redission.port = 端口号

image.gif

至此,一个非常简易的自定义Starter就完成了。

代码实例:如何自定义一个SpringBoot中的starter代码实例.zip

相关实践学习
基于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
目录
相关文章
|
3月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
2月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
220 0
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
223 2
|
3天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
35 14
|
23天前
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
34 0
|
3月前
|
Java Spring
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
|
2月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
83 2
|
2月前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
4月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
4月前
|
JSON 安全 Java