自定义redis-spring-boot-starter

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 写本文的原因1)某大佬问我有没有自定义过starter?没有2)因为不会,所以学习3) 没有整合其它技术的小案例不完整,所以选择了个人认为简单的redis,自定义myredis-spring-boot -starter

自定义starter的命名规范


SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>1.2.2</version>
        </dependency>


官方建议自定义的starter使用xxx-spring-boot-starter命名规则。以区分SpringBoot生态提供的starter。


        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.2</version>
        </dependency>


项目结构及介绍


项目结构


7.png


项目介绍


1)此项目为定义一个redis整合SpringBoot的starter,为了方便区别用my前缀标记自定义的类。


2)myredis-spring-boot-autoconfigure:自定义myredis-starter的核心,核心都在这个module中


3)myredis-spring-boot-starter: 仅仅添加了myredis-spring-boot-autoconfigure的依赖 ,目的是隐藏 细节


4)springboot-demo : 引入自定义的starter依赖,进行测试


项目下载


url:

share/StarterDemo at master · cbeann/share · GitHub


注意:

先install 父工程,

在install 子工程 myredis-spring-boot-autoconfigure

在install 子工程 myredis-spring-boot-starter

在添加依赖在运行测试


项目构建


myredis-spring-boot-autoconfigure模块(Maven项目)


添加依赖


        <!-- 引入spring-boot-starter,所有starter的基本配合 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>
        <!--自定义的yml提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.2.2.RELEASE</version>
            <optional>true</optional>
        </dependency>
        <!-- jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.0.1</version>
        </dependency>


连接redis的参数配置类


package com.myredis;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
 * @author CBeann
 * @create 2020-05-30 14:51
 */
@ConfigurationProperties(prefix = "myredis")
public class MyRedisProperties {
    //ip
    private String host;
    //密码
    private String password;
    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;
    }
}


自定义myredisTemplate


package com.myredis;
import redis.clients.jedis.Jedis;
/**
 * @author CBeann
 * @create 2020-05-30 15:03
 */
public class MyRedisTemplate {
    private Jedis jedis;
    public MyRedisTemplate(Jedis jedis) {
        this.jedis = jedis;
    }
    public String  setString(String key ,String val){
        String set = jedis.set(key, val);
        return set;
    }
    public Long  delKey(String key){
        Long del = jedis.del(key);
        return del;
    }
    public MyRedisTemplate() {
    }
}


MyRedisAutoConfigulation自动配置类


package com.myredis;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.Jedis;
/**
 * @author CBeann
 * @create 2020-05-30 14:59
 */
@Configuration
@EnableConfigurationProperties(MyRedisProperties.class)
@ConditionalOnProperty(prefix = "myredis",name = "host",
        matchIfMissing =false)//如果application.yml或者properties中没有myredis.host属性,则此类MyRedisAutoConfigulation不注入IOC容器
public class MyRedisAutoConfigulation {
    @Bean
    public Jedis jedis(MyRedisProperties myRedisProperties) {
        //获取redis的参数
        String host = myRedisProperties.getHost();
        String password = myRedisProperties.getPassword();
        // 连接redis服务
        Jedis jedis = new Jedis(host, 6379);
        jedis.auth(password);
        return jedis;
    }
    @Bean
    public MyRedisTemplate myRedisTemplate(Jedis jedis) {
        return new MyRedisTemplate(jedis);
    }
}


创建spring.factories


在resources下创建目录META-INF,在META-INF下创建spring.factories,即resources/META-INF/spring.factories


其中等号(=)左边为固定值,右边为自定义的自动配置类


# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.myredis.MyRedisAutoConfigulation


安装到本地仓库


clean->install


myredis-spring-boot-starter(Maven项目)


添加上面模块的依赖


 <dependency>
           <groupId>com.cbeann</groupId>
           <artifactId>myredis-spring-boot-autoconfigure</artifactId>
           <version>1.0-SNAPSHOT</version>
       </dependency>


安装到本地仓库


clean->install


springboot-demo模块(SpringBoot项目+web)


项目基础


SpringBoot+web


修改pom文件


  <!--自定义starter-->
        <dependency>
            <groupId>com.cbeann</groupId>
            <artifactId>myredis-spring-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>


添加application.yml配置信息


myredis.host=39.105.30.146
myredis.password=123456


创建controller进行测试


package com.example.springbootdemo.controller;
import com.myredis.MyRedisTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalTime;
/**
 * @author CBeann
 * @create 2020-05-30 15:25
 */
@RestController
public class HelloController {
    @Autowired
    private MyRedisTemplate myRedisTemplate;
    @RequestMapping("/hello")
    public String hello(){
        myRedisTemplate.setString("key2", LocalTime.now().toString());
        return LocalTime.now().toString();
    }
//    @RequestMapping("/hello")
//    public String hello2(){
//        return LocalTime.now().toString();
//    }
}


测试结果


http://localhost:8080/hello

redis中添加了key,value数据


总结


1)yml提示


在myredis-spring-boot-autoconfigure中添加依赖,并且类(MyRedisProperties )上有注解


<!--自定义yml提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.2.2.RELEASE</version>
            <optional>true</optional>
        </dependency>


8.png


2)如果没有上图中的属性,证明我不用redis,系统不应该报错


如果我没有配置myredis的属性,我也没用redis,正常的逻辑是不能报错。


报错的原因是你没有配置myredis的信息,但是他还是加载Jedis并且创建连接,那肯定是报错了,所以不让他加载MyRedisAutoConfigulation这个类,那么这个关于自定义Starter的类就全不让它加载,那么就和没有引入这个依赖一样


下面代码所示, 如果application.yml或者properties中没有myredis.host属性,则此类MyRedisAutoConfigulation不注入IOC容器


@ConditionalOnProperty(prefix = "myredis",name = "host",
        matchIfMissing =false)//如果application.yml或者properties中没有myredis.host属性,则此类MyRedisAutoConfigulation不注入IOC容器
public class MyRedisAutoConfigulation {
相关实践学习
基于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
目录
相关文章
|
10天前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
10天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
17天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
67 14
|
2月前
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
63 0
|
3月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
90 2
|
5月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
5月前
|
JSON 安全 Java
|
5月前
|
监控 安全 Java
【开发者必备】Spring Boot中自定义注解与处理器的神奇魔力:一键解锁代码新高度!
【8月更文挑战第29天】本文介绍如何在Spring Boot中利用自定义注解与处理器增强应用功能。通过定义如`@CustomProcessor`注解并结合`BeanPostProcessor`实现特定逻辑处理,如业务逻辑封装、配置管理及元数据分析等,从而提升代码整洁度与可维护性。文章详细展示了从注解定义、处理器编写到实际应用的具体步骤,并提供了实战案例,帮助开发者更好地理解和运用这一强大特性,以实现代码的高效组织与优化。
253 0
|
6月前
|
消息中间件 Java Kafka
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
221 5
|
6月前
|
Java Spring 容器
Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作
Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作
293 3