springboot自定义redis-starter的实现

spring时代整合redis

spring我相信只要是一个Java开发人员我相信再熟悉不过了,几乎垄断了整个JavaEE的市场份额,话不多说进入正题。

首先看看我们在spring中整合redis需要做什么

1、首先maven工程的话不用想先导入依赖

<!-- jedis -->
  <dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.4.2</version>
  </dependency>
<!-- 2、spring整合Redis的jar包 -->
  <dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-redis</artifactId>
   <version>1.4.2.RELEASE</version>
  </dependency>

2、在spring-xml中配置

<!-- 1、配置jedis连接池信息 -->
  <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!-- 最大连接数-->
    <property name="maxTotal" value="50"></property>
    <property name="maxIdle" value="5"></property>
   	....... 这里省略一些更多配置
  </bean>

  <!--2、配置连接工厂JedisConnectionFactory-->
  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <!--需要自定义一些工厂属性配置信息-->
    <!-- 服务器地址 -->
    <property name="hostName" value="127.0.0.1"></property>
    <!-- 服务端口号 -->
    <property name="port" value="6379"></property>
    <!-- 密码 -->
    <property name="password" value="yichun"></property>
    <!-- 连接池配置:再把第一步配置好的连接池信息通过属性注入进来 否则会采用默认的连接池-->
    <property name="poolConfig" ref="jedisPoolConfig"></property>
  </bean>

	<!--  3、配置RedisTemplate模板  把第二步配置好的连接工厂JedisConnectionFactory通过属性注入到RedisTemplate模板中-->
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory"></property>

  	  <!-- 配置一些key和value的序列化操作,可选操作 -->
    <property name="keySerializer">
      <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
    </property>
    <property name="valueSerializer">
      <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
    </property>
  </bean>

	4、这样子以后我们就可以在业务层通过 @Autowired 引用redis操作模板了
	 @Autowired
   RedisTemplate<String,String> redisTemplate;

3、上面就是spring使用redis的大致流程。

这样子看起来也还好啊?
但是每个项目都要去经过这么一系列繁琐的xml配置,这就是重复工作了。这时候就出现了“springboot” 就是专门去做这些整合的事情了,让我们不需要整合这些只需几行基础配置即可。

springboot 实现自动装配redis

在开始spring boot之前我们首先要来看几个注解,spring boot实现自定义装配的核心就是这几个注解:

1、@Import:Import注解的主要的作用是将bean导入到spring容器中,比如说要自定义一些bean交spring容器托管,这是我们就可以建一个配置类使用import注解专门去导入你自定义的一些bean到spring容器中。

2、@Bean:Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。

3、@Component:通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。

4、@Configuration:来声明一个spring的配置类等同于spring中的xml文件,ConfigurationClassPostProcessor::enhanceConfigurationClasses这个方法是Configuration注解工作的核心方法,spring应用启动时所有的被@Configuration注解的类都会被spring cglib库生成cglib动态代理,然后其他地方通过@Autowired注解引入Student类对象就会被生成的configuration配置类生成的动态代理拦截,处理完后再调用原configuration注解类的student方法获取到Student实例。

5、@Conditiona:个人感觉主要是做一些判断条件的、只有当condition的machet匹配方法为 true 的时候【该方法内也是我们实现一些自定义逻辑判断的扩展点】,才会去加载该bean 否则不加载该bean。
----- condition又繁衍出很多子类(方便我们直接使用)
@ConditionalOnMissingBean:当容器下有当前这个bean就不加载没有则加载

@ConditionalOnExpression:当括号中的内容为true时,使用该注解的类被实例化。
示例:
@ConditionalOnExpression("KaTeX parse error: Expected 'EOF', got '&' at position 25: …mer.enabled}==1&̲&{rabbitmq.comsumer.enabled:true}")
@ConditionalOnExpression("'${mq.comsumer}'.equals(‘rabbitmq')")

@ConditionalOnClass:当classpath下有某个class的时候,就执行下面操作

@ConditionalOnBean:只有当给定的bean存在时、则实例化当前bean。

1、新建两个项目:一个autoconfig一个starter项目

注:【maven项目即可】。
starter:主要是做让其他项目依赖的start。
autoconfig:实现具体自动装配逻辑处理。

2、添加 autoconfig 项目中的pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.xing.modules</groupId>
  <artifactId>spring-boot-redis-autoconfig</artifactId>
  <version>1.0.0</version>

  <properties>
    <!-- Environment Settings -->
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <jedis.version>2.9.0</jedis.version>
    <springboot.version>2.1.4.RELEASE</springboot.version>
  </properties>

  <dependencies>
    <!-- springboot-stater -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>${springboot.version}</version>
    </dependency>

    <!-- spring-data-redis -->
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>${springboot.version}</version>
    </dependency>

    <!-- Jedis -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>${jedis.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure-processor</artifactId>
      <version>${springboot.version}</version>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>

3、starter 项目中pom 只需添加autoconfig依赖即可。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.xing.modules</groupId>
  <artifactId>spring-boot-redis-starter</artifactId>
  <version>1.0.0</version>

  <properties>
    <!-- Environment Settings -->
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.xing.modules</groupId>
      <artifactId>spring-boot-redis-autoconfig</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>
</project>

4、autoconfig项目中创建一个包configuration、再创建一个RedisConfiguration类。

package org.xing.modules.configuration;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisOperations;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.net.ConnectException;

/**
 * {@like @ConditionalOnClass:
 * This annotation indicates that there must be RedisOperations in the current classpath to inject this Bean}
 *
 * @ConditionalOnClass(Jedis.class)
 * 此注解表示当前ClassPath必须包含有Jedis这个类才会入这个配置类到spring容器中
 * 意思就是项目当中存在了jedis客户端依赖才觉得你需要使用,否则就没必要去注入.
 *
 * @author Created by John on 2020/10/12
 */
@Configuration
@ConditionalOnClass(Jedis.class)
public class RedisConfiguration {

  // 加载配置文件信息 这里使用properties类去做配置加载。
  // @src = org.xing.modules.configuration.RedisProperties

  【**如下步骤 跟 spring 配置流程雷同**】
  /**
   *	  <!-- 1、配置jedis连接池信息 -->
   *   <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
   *     <property name="maxTotal" value="50"></property>
   *     <property name="maxIdle" value="5"></property>
   *   </bean>
   */
  @Bean
  public JedisPool jedisPool(RedisProperties redisProperties) throws ConnectException {
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMinIdle(redisProperties.getMinIdle());
    jedisPoolConfig.setMaxIdle(redisProperties.getMaxIdle());
    jedisPoolConfig.setMaxWaitMillis(redisProperties.getMaxWait());
    jedisPoolConfig.setMaxTotal(redisProperties.getMaxActive());
    String password = isBlank(redisProperties.getPassword()) ? null:redisProperties.getPassword();

    return new JedisPool(jedisPoolConfig,redisProperties.getHost(),redisProperties.getPort(),redisProperties.getTimeout(),password);
  }

  /**   <!--2、配置连接工厂JedisConnectionFactory-->
   *   <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
   *     <!-- 服务器地址 -->
   *     <property name="hostName" value="127.0.0.1"></property>
   *     <!-- 服务端口号 -->
   *     <property name="port" value="6379"></property>
   *     <!-- 密码 -->
   *     <property name="password" value="yichun"></property>
   *     <!-- 连接池配置:再把第一步配置好的连接池信息通过属性注入进来 否则会采用默认的连接池-->
   *     <property name="poolConfig" ref="jedisPoolConfig"></property>
   *   </bean>
   */
  @Bean
  public JedisConnectionFactory redisConnectionFactory(RedisProperties redisProperties) {
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
    jedisConnectionFactory.setHostName(redisProperties.getHost());
    jedisConnectionFactory.setPort(redisProperties.getPort());
    jedisConnectionFactory.setPassword(redisProperties.getPassword());
    jedisConnectionFactory.setDatabase(redisProperties.getDatabase());
    return jedisConnectionFactory;
  }

  // 第三步抽离出:@src = org.xing.modules.template.RedisTemplateConfiguration
  /** 	<!--  3、配置RedisTemplate模板  把第二步配置好的连接工厂JedisConnectionFactory通过属性注入到RedisTemplate模板中-->
   *   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
   *     <property name="connectionFactory" ref="jedisConnectionFactory"></property>
   *
   *  	  <!-- 配置一些key和value的序列化操作,可选操作 -->
   *     <property name="keySerializer">
   *       <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
   *     </property>
   *     <property name="valueSerializer">
   *       <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
   *     </property>
   *   </bean>
   */

  public static boolean isBlank(String str) {
    return str == null || "".equals(str.trim());
  }
}

5、创建properties配置文件加载类

package org.xing.modules.configuration;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author Created by mr_zhou on 2020/10/12
 *
 * @TODO: "my.springboot.redis" Qualified redis configuration must begin with this prefix
 * 限定使用此starter的redis配置必须以“my.springboot.redis.”为前缀
 * 示例:
 * my.springboot.redis.host
 * my.springboot.redis.prot
 */
@Component
@ConfigurationProperties(prefix = "my.springboot.redis")
public class RedisProperties {

  private int port;
  private String host;
  private String password;
  private int timeout;
  private int database;
  @Value("${redis.pool.max-active}")
  private int maxActive;
  @Value("${redis.pool.max-wait}")
  private int maxWait;
  @Value("${redis.pool.max-idle}")
  private int maxIdle;
  @Value("${redis.pool.min-idle}")
  private int minIdle;

  // 省略 get/set方法

6、创建redis操作模板类

这里其实也可以 RedisConfiguration 类中注入到spring容器中,但是为了职责划分就单独使用。

package org.xing.modules.template;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

/**
 * TODO: Redis Template Configuration Class
 *
 * @author Created by mr_zhou on 2020/10/12
 */
@Configuration
public class RedisTemplateConfiguration {
  @Bean
  @ConditionalOnMissingBean
  public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory){
    RedisTemplate redisTemplate = new RedisTemplate();
    redisTemplate.setConnectionFactory(jedisConnectionFactory);
    return redisTemplate;
  }
  // 更多模板注入.....
}

7、Redis对外出口配置类

该类主要作用于spring容器加载入口

package org.xing.modules.template;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

/**
 * TODO: Redis Template Configuration Class
 *
 * @author Created by mr_zhou on 2020/10/12
 */
@Configuration
public class RedisTemplateConfiguration {
  @Bean
  @ConditionalOnMissingBean
  public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory){
    RedisTemplate redisTemplate = new RedisTemplate();
    redisTemplate.setConnectionFactory(jedisConnectionFactory);
    return redisTemplate;
  }
  // 更多模板注入.....
}

8、springboot优雅扩展的入口

我们打开springboot自动配置jar里面的源码:
springboot自动装配主要是扫描
【META-INF 下的 spring.factories 文件下 # Auto Configure】下的所有类

因此我们照葫芦画瓢【在starter下创建META-INF 再创建spring.factories】

让后在maven里面先后 autoconfig -> starter install一下。

9、demo使用自定义starter

1、在demo项目中加入自定义starter的依赖

2、最后就可以直接在项目中注入使用redis。
【pom里面可以看到我们没有加任何redis依赖的只加了自定义的starter】

/**
 * @author Created by mr_zhou on 2020/10/12
 */
public class MyService {

  @Autowired
  private RedisTemplate redisTemplate;

}

3、配置redis连接信息即可操作 - 对应 RedisProperties 属性。

10、全剧终

最后我们就可以慢慢完善自己的starter做到以后直接使用自己的redis封装一些常用的操作。

到此这篇关于springboot自定义redis-starter的实现的文章就介绍到这了,更多相关springboot自定义redis-starter内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解spring boot starter redis配置文件

    spring-boot-starter-Redis主要是通过配置RedisConnectionFactory中的相关参数去实现连接redis service. RedisConnectionFactory是一个接口,有如下4个具体的实现类,我们通常使用的是JedisConnectionFactory. 在spring boot的配置文件中redis的基本配置如下: # Redis服务器地址 spring.redis.host=192.168.0.58 # Redis服务器连接端口 spring.

  • SpringBoot自定义Redis实现缓存序列化详解

    目录 1.自定义RedisTemplate 1.1.Redis API默认序列化机制 1.2.自定义RedisTemplate序列化机制 1.3.效果测试 2.自定义RedisCacheManager 2.1.Redis注解默认序列化机制 2.2.自定义RedisCacheManager 刚刚完成了Spring Boot整合Redis进行了数据的缓存管理,但缓存管理的实体类数据使用的是JDK序列化方式,不便于使用可视化管理工具进行查看和管理. 接下来分别针对基于注解的Redis缓存实现和基于AP

  • SpringBoot自定义启动器Starter流程详解

    目录 一.背景 二.自定义启动器 1.创建一个启动器的自动配置模块 2.创建一个启动器模块 3.在业务模块中引入启动器 一.背景 虽然Spring官方给我们提供了很多的启动器供我们使用 但有时候我们也会遇到某些特殊场景,这些启动器满足不了 这个时候就需要自定义一个启动器供我们使用 二.自定义启动器 在之前学习Spring Boot的过程中,我们已经对启动器有了一个大致的了解 Spring Boot实现某个功能,一般是引入对应场景的启动器(一般不写代码,只是声明这个启动器需要引用哪些依赖),然后这

  • Java SpringBoot自定义starter详解

    目录 一.什么是SpringBoot starter机制 二.为什么要自定义starter ? 三.什么时候需要创建自定义starter? 四.自定义starter的开发流程(案例:为短信发送功能创建一个starter) 1.细节:命名规范 2.必须引入的依赖 3.编写相关属性类(XxxProperties):例如 SmsProperties.java 4.编写Starter项目的业务功能 5.编写自动配置类AutoConfig 6.编写spring.factories文件加载自动配置类 7.打

  • SpringBoot自定义starter实例代码

    一.简介 SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入SpringBoot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能.即使是这样,SpringBoot也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对SpringBoot的使用. 下面话不多说了,来一起看看详细的介绍吧 二.如何自定义starter 1.实例 如何编写自动配置 ? 我们参照@WebMvcAutoConfigurati

  • springboot自定义starter实现过程图解

    这篇文章主要介绍了springboot自定义starter实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.创建一个Empty Project 2.在该工程中点击+,选择new module,新建一个maven工程 点击确定. 3.在该工程中点击+,选择new module,新建一个Spring Initializr工程 后面直接默认next,然后点击finishi. 两个都创建完毕之后点击apply,点击OK.得到如下结构: 4

  • 使用SpringBoot自定义starter的完整步骤

    前言 使用过SpringBoot的都应该知道,一个SpringBoot 项目就是由一个一个 Starter 组成的,一个 Starter 代表该项目的 SpringBoot 启动依赖,除了官方已有的 Starter,我们可以根据自己的需要自定义新的Starter. 一.自定义SpringBoot Starter 自定义Starter,首选需要实现自动化配置,而要实现自动化配置需要满足以下两个条件: (1)能够自动配置项目所需要的配置信息,也就是自动加载依赖环境: (2)能够根据项目提供的信息自动

  • 如何自定义redis工具jar包供其他SpringBoot项目直接使用

    注:(最终redis数据库连接信息由使用者项目模块配置提供) 一.Redis常用存储操作实现(redis-util模块,该module最后会打包成jar供其他服务使用) 1.引用相关依赖 <!-- 如果有继承父级spring-boot-starter-parent,可不用添加版本号 --> <!-- Redis缓存 [start] --> <dependency> <groupId>org.springframework.boot</groupId&g

  • SpringBoot集成Redis,并自定义对象序列化操作

    SpringBoot项目使用redis非常简单,pom里面引入redis的场景启动器,在启动类上加@EnableCaching注解,项目启动会自动匹配上redis,这样项目中就可以愉快地使用了, 使用方法:要么使用@Cacheable一类的注解自动缓存,要么使用RedisTemplate手动缓存. (前提是你的本机或者是远程主机要先搭好redis环境) 虽然SpringBoot好用,但这里也有好多坑,SpringBoot和MySQL一样,易学难精,阳哥说的对,练武不练功,到老一场空. 下面,我将

  • SpringBoot配置Redis自定义过期时间操作

    SpringBoot配置Redis自定义过期时间 Redis配置依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.4.RELEASE</version> </dependency> <dependency>

  • springboot自定义starter启动器的具体使用实践

    目录 第一步.创建 xxx-spring-boot-starter 的spring Initializr模块 第二步.删除不需要的内容(启动类.除下面spring-boot-starter的其它依赖,maven编译插件) 第三步.写代码,对外提供一些自己写的类 第四步.在resources资源文件夹下创建一个META-INF文件夹,并创建一个spring.factories文件 第五步.将该项目发布的maven仓库,或者安装到本地仓库中让其它项目能使用的到 第六步.测试自己定义的启动器使用有效

随机推荐