需求
假设项目中对于共用功能独立了一个plugin-starter项目(maven管理引入),里面涉及到http调用外部获取数据,针对http请求的部分数据加了Redis缓存。由于plugin里使用当前微服务配置的Redis,如果某个微服务更新了数据,会有其他微服务无法同步更新缓存的问题。
思路
既然是数据无法同步,plugin-starter独立使用一个Redis即可解决这个问题。
- 首先要保证各微服务不用修改redisTemplate的装配。所以需要在plugin-starter项目使用spring.redis默认的配置注入一个spring bean “redisDefaultTemplate”,并使用@Primary注解。
- 自定义Redis配置项。并使用spring的Configuration注解获取配置参数。
- 使用第2步的配置实例化一个bean “redisPluginTemplate”。 plugin-starter项目使用@Qualifier装配bean “redisPluginTemplate”,按需使用。
编码实现
实现spring.redis默认配置的bean redisDefaultTemplate
查看RedisAutoConfiguration源码,发现使用的是@ConditionalOnMissingBean,即项目可以自定义redisTemplate bean来覆盖默认的bean。
所以增加一个自定义的bean “redisDefaultTemplate”覆盖默认配置。
自定义Redis配置项
创建RedisTemplateConfiguration,自动获取配置文件的配置。
配置bean
实现redis连接工厂。
通过自定义配置的redis实例化一个bean。
测试
测试类注入时指定bean,测试自定义bean。注入时不指定bean,测试spring.redis标准配置是否生效。