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

准备工作


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

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

 

空starter jar包的用意


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

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

 


这与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

 


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

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

 


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

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

 


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

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

 


在项目启动时,配置文件里的值会被设置到这个类里,供自动配置来使用。
注:XxxProperties这样的类名是约定好的,就表示自动配置需要的配置(属性)数据。如RedisProperties等。
2)自动配置入口
按照约定,一般以AutoConfiguration结尾的类都是自动配置的入口类,这里的是RedisAutoConfiguration,如图:

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

 


对图中内容进行简单的解说:
@EnableConfigurationProperties(RedisProperties.class)这行代码其实就是要完成第一步配置数据的工作。
下面的两个@Bean方法分别是向容器中注册RedisTemplate和StringRedisTemplate两个bean。它们来自spring-data-redis项目,是spring对redis整合后给出的“门面”类,以供用户代码操作redis。
但是这两个bean都需要依赖RedisConnectionFactory类型的bean,这个依赖从哪里来呢?就在@Import注解引入的那两个类里。
3)自动配置代码
先看JedisConnectionConfiguration类,如图:

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

 

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

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

 

这个类可以向容器中注册一个LettuceConnectionFactory(它实现了RedisConnectionFactory接口)类型的bean,但是有一个条件就是类上的注解@ConditionalOnClass指定的1个类必须存在,幸运的是它存在,因为springboot默认选择的是Lettuce客户端。
这就是整个自动配置的过程,最后适合的bean就会被注册到spring容器中,用户代码就可以使用了。

测试一下RedisTemplate


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

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

 


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

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

 


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

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

 


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

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

 

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

准备工作


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

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

 

空starter jar包的用意


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

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

 


这与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

 


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

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

 


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

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

 


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

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

 


在项目启动时,配置文件里的值会被设置到这个类里,供自动配置来使用。
注:XxxProperties这样的类名是约定好的,就表示自动配置需要的配置(属性)数据。如RedisProperties等。
2)自动配置入口
按照约定,一般以AutoConfiguration结尾的类都是自动配置的入口类,这里的是RedisAutoConfiguration,如图:

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

 


对图中内容进行简单的解说:
@EnableConfigurationProperties(RedisProperties.class)这行代码其实就是要完成第一步配置数据的工作。
下面的两个@Bean方法分别是向容器中注册RedisTemplate和StringRedisTemplate两个bean。它们来自spring-data-redis项目,是spring对redis整合后给出的“门面”类,以供用户代码操作redis。
但是这两个bean都需要依赖RedisConnectionFactory类型的bean,这个依赖从哪里来呢?就在@Import注解引入的那两个类里。
3)自动配置代码
先看JedisConnectionConfiguration类,如图:

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

 

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

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

 

这个类可以向容器中注册一个LettuceConnectionFactory(它实现了RedisConnectionFactory接口)类型的bean,但是有一个条件就是类上的注解@ConditionalOnClass指定的1个类必须存在,幸运的是它存在,因为springboot默认选择的是Lettuce客户端。
这就是整个自动配置的过程,最后适合的bean就会被注册到spring容器中,用户代码就可以使用了。

测试一下RedisTemplate


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

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

 


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

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

 


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

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

 


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

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

 

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

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