深度解析SpringBoot2.x整合Spring-Data-Redis

原创: 李新杰 编程新说 3天前

 

准备工作


准备一个springboot2.x的工程,并引入web和spring-data-redis的starter,再引入对象池commons-pool2的依赖。如图:
    

深度解析SpringBoot2.x整合Spring-Data-Redis_第1张图片

 

有心的朋友如果去查看spring-data-redis的starter对应的jar包spring-boot-starter-data-redis-2.1.3.RELEASE.jar时,发现它是一个空的,这是为何呢?如图:
 

                                                               深度解析SpringBoot2.x整合Spring-Data-Redis_第2张图片


这与springboot的工作原理有关,springboot引入了一个核心机制就是,AutoConfiguration,自动配置。那自动配置的依据是什么呢?就是看看你都引入了哪些jar包,或者检测某些特定的Class是否存在。

所以这个空jar包就相当于一个“标识物”,只要它存在,就相当于告诉springboot我要使用spring-data-redis了,你给我自动配置吧。此外它还有一个作用就是把需要的相关依赖给引入进来。

 

自动配置大揭秘



因为redis早已成为互联网开发的标配,所以spring官方很早就整合了redis,在spring data这个项目里叫spring-data-redis。springboot官方自然也提供了对spring-data-redis的自动配置,毕竟是自家的项目嘛。

凡是由springboot官方提供的自动配置,相关配置代码都在这个spring-boot-autoconfigure-2.1.3.RELEASE.jar包里,如图:
 

                                              深度解析SpringBoot2.x整合Spring-Data-Redis_第3张图片


在这里可以找到和spring-data-redis相关的配置代码,如图:
 

                                        深度解析SpringBoot2.x整合Spring-Data-Redis_第4张图片


1)配置数据

虽然springboot能帮我们自动配置,但我们还是要提供一些配置数据的。这些数据一般都放到application.yml配置文件里。spring-data-redis的配置数据如下图:

 

                                                 深度解析SpringBoot2.x整合Spring-Data-Redis_第5张图片


上图中的这种层级结构其实是预先定义好的,它和RedisProperties这个类保持一致,如图:
 

                                       深度解析SpringBoot2.x整合Spring-Data-Redis_第6张图片


在项目启动时,配置文件里的值会被设置到这个类里,供自动配置来使用。

注:XxxProperties这样的类名是约定好的,就表示自动配置需要的配置(属性)数据。如RedisProperties等。

2)自动配置入口

按照约定,一般以 AutoConfiguration 结尾的类都是自动配置的入口类,这里的是RedisAutoConfiguration,如图:
 

                     深度解析SpringBoot2.x整合Spring-Data-Redis_第7张图片


对图中内容进行简单的解说:

@EnableConfigurationProperties(RedisProperties.class)这行代码其实就是要完成第一步配置数据的工作。

下面的两个@Bean方法分别是向容器中注册RedisTemplate和StringRedisTemplate两个bean。它们来自spring-data-redis项目,是spring对redis整合后给出的“门面”类,以供用户代码操作redis。

但是这两个bean都需要依赖RedisConnectionFactory类型的bean,这个依赖从哪里来呢?就在@Import注解引入的那两个类里。

3)自动配置代码

先看JedisConnectionConfiguration类,如图:
 

                      深度解析SpringBoot2.x整合Spring-Data-Redis_第8张图片

 

这个类可以向容器中注册一个JedisConnectionFactory(它实现了RedisConnectionFactory接口)类型的bean,但是有一个条件就是类上的注解@ConditionalOnClass指定的3个类都必须存在,可惜的是Jedis.class并不存在,因为springboot默认没有选择Jedis客户端。

再看LettuceConnectionConfiguration类,如图:
 

                 深度解析SpringBoot2.x整合Spring-Data-Redis_第9张图片

 

这个类可以向容器中注册一个LettuceConnectionFactory(它实现了RedisConnectionFactory接口)类型的bean,但是有一个条件就是类上的注解@ConditionalOnClass指定的1个类必须存在,幸运的是它存在,因为springboot默认选择的是Lettuce客户端。

这就是整个自动配置的过程,最后适合的bean就会被注册到spring容器中,用户代码就可以使用了。

 

测试一下RedisTemplate



把自动配置代码注册到容器中的那两个bean注入到一个Controller里,进行简单测试,如图:
 

          深度解析SpringBoot2.x整合Spring-Data-Redis_第10张图片


首先请求一下第一个方法,发现两个bean已经被注入,如图:
 

                       深度解析SpringBoot2.x整合Spring-Data-Redis_第11张图片


然后再请求一下第二个方法,内容返回正确,说明可以正常读写redis,如图:
 

                       深度解析SpringBoot2.x整合Spring-Data-Redis_第12张图片


最后再到redis里看看,发现有名字为name的这个key,也有对应的值。如图:
 

                                     深度解析SpringBoot2.x整合Spring-Data-Redis_第13张图片

 

PS:很简单吧。只是原来由开发者配置的东西现在由代码自动来配置而已。配置本身并没有减少,反而因加入了自动检测逻辑而变多。

 

源码地址:

https://github.com/coding-new-talking/cnt-springboot

你可能感兴趣的:(深度解析SpringBoot2.x整合Spring-Data-Redis)