空starter jar包的用意
有心的朋友如果去查看spring-data-redis的starter对应的jar包spring-boot-starter-data-redis-2.1.3.RELEASE.jar时,发现它是一个空的,这是为何呢?如图:
这与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包里,如图:
在这里可以找到和spring-data-redis相关的配置代码,如图:
1)配置数据
虽然springboot能帮我们自动配置,但我们还是要提供一些配置数据的。这些数据一般都放到application.yml配置文件里。spring-data-redis的配置数据如下图:
上图中的这种层级结构其实是预先定义好的,它和RedisProperties这个类保持一致,如图:
在项目启动时,配置文件里的值会被设置到这个类里,供自动配置来使用。
注:XxxProperties这样的类名是约定好的,就表示自动配置需要的配置(属性)数据。如RedisProperties等。
2)自动配置入口
按照约定,一般以AutoConfiguration结尾的类都是自动配置的入口类,这里的是RedisAutoConfiguration,如图:
对图中内容进行简单的解说:
@EnableConfigurationProperties(RedisProperties.class)这行代码其实就是要完成第一步配置数据的工作。
下面的两个@Bean方法分别是向容器中注册RedisTemplate
这个类可以向容器中注册一个JedisConnectionFactory(它实现了RedisConnectionFactory接口)类型的bean,但是有一个条件就是类上的注解@ConditionalOnClass指定的3个类都必须存在,可惜的是Jedis.class并不存在,因为springboot默认没有选择Jedis客户端。
再看LettuceConnectionConfiguration类,如图:
这个类可以向容器中注册一个LettuceConnectionFactory(它实现了RedisConnectionFactory接口)类型的bean,但是有一个条件就是类上的注解@ConditionalOnClass指定的1个类必须存在,幸运的是它存在,因为springboot默认选择的是Lettuce客户端。
这就是整个自动配置的过程,最后适合的bean就会被注册到spring容器中,用户代码就可以使用了。
测试一下RedisTemplate
把自动配置代码注册到容器中的那两个bean注入到一个Controller里,进行简单测试,如图:
首先请求一下第一个方法,发现两个bean已经被注入,如图:
然后再请求一下第二个方法,内容返回正确,说明可以正常读写redis,如图:
最后再到redis里看看,发现有名字为name的这个key,也有对应的值。如图:
PS:很简单吧。只是原来由开发者配置的东西现在由代码自动来配置而已。配置本身并没有减少,反而因加入了自动检测逻辑而变多。
空starter jar包的用意
有心的朋友如果去查看spring-data-redis的starter对应的jar包spring-boot-starter-data-redis-2.1.3.RELEASE.jar时,发现它是一个空的,这是为何呢?如图:
这与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包里,如图:
在这里可以找到和spring-data-redis相关的配置代码,如图:
1)配置数据
虽然springboot能帮我们自动配置,但我们还是要提供一些配置数据的。这些数据一般都放到application.yml配置文件里。spring-data-redis的配置数据如下图:
上图中的这种层级结构其实是预先定义好的,它和RedisProperties这个类保持一致,如图:
在项目启动时,配置文件里的值会被设置到这个类里,供自动配置来使用。
注:XxxProperties这样的类名是约定好的,就表示自动配置需要的配置(属性)数据。如RedisProperties等。
2)自动配置入口
按照约定,一般以AutoConfiguration结尾的类都是自动配置的入口类,这里的是RedisAutoConfiguration,如图:
对图中内容进行简单的解说:
@EnableConfigurationProperties(RedisProperties.class)这行代码其实就是要完成第一步配置数据的工作。
下面的两个@Bean方法分别是向容器中注册RedisTemplate
这个类可以向容器中注册一个JedisConnectionFactory(它实现了RedisConnectionFactory接口)类型的bean,但是有一个条件就是类上的注解@ConditionalOnClass指定的3个类都必须存在,可惜的是Jedis.class并不存在,因为springboot默认没有选择Jedis客户端。
再看LettuceConnectionConfiguration类,如图:
这个类可以向容器中注册一个LettuceConnectionFactory(它实现了RedisConnectionFactory接口)类型的bean,但是有一个条件就是类上的注解@ConditionalOnClass指定的1个类必须存在,幸运的是它存在,因为springboot默认选择的是Lettuce客户端。
这就是整个自动配置的过程,最后适合的bean就会被注册到spring容器中,用户代码就可以使用了。
测试一下RedisTemplate
把自动配置代码注册到容器中的那两个bean注入到一个Controller里,进行简单测试,如图:
首先请求一下第一个方法,发现两个bean已经被注入,如图:
然后再请求一下第二个方法,内容返回正确,说明可以正常读写redis,如图:
最后再到redis里看看,发现有名字为name的这个key,也有对应的值。如图:
PS:很简单吧。只是原来由开发者配置的东西现在由代码自动来配置而已。配置本身并没有减少,反而因加入了自动检测逻辑而变多。