CacheUtil使用的redisCacheManager的实例化加载来源

Blade 已结 2 1525
黄大仙
黄大仙 2021-01-25 14:46
悬赏:5

一、该问题的重现步骤是什么?

1.  新建了一个工程,然后导入了cache和redis的依赖包

2.  启动时候提示redisCacheManager有两个实例化配置类

3.当我为了以上问题使用spring.main.allow-bean-definition-overriding: true来解决时候,发现CacheUtil无法使用了,报错如下:


image.png

二、你期待的结果是什么?实际看到的又是什么?

调试发现实际我们的cachemanager注入进来的不是RedisAutoCacheManager实例,而是JwtRedisConfiguration配置得到的redisCacheManager,这样就跟我们引入的blade-starter-redis里面的相冲突了,不是按照预期配置的序列化方式来操作redis缓存了。


现在不确定现在现在的加载逻辑,因为@AutoConfigureBefore({RedisAutoConfiguration.class}),RedisAutoConfiguration之前就先去加载了这个类JwtRedisConfiguration,那么我们的BladeRedisCacheAutoConfiguration加载时候岂不是永远都加载不到RedisAutoCacheManager,但是在我们的Blade项目里面确实正常的,首先就进入了BladeRedisCacheAutoConfiguration类去实例化正确的redisCacheManager。

image.png


image.png

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

Blade商业版 2.7.0  Windows

2条回答
  •  黄大仙
    黄大仙 (楼主)
    2021-01-26 09:09

    我刚刚看了下我们的blade-biz的blade-demo的代码,发现默认也会首先进入JwtRedisConfiguration,但是当我把配置里面的@ComponentScan({"org.springblade", "com.example"})中的org.springblade,移除之后就会正常的进入到BladeRedisCacheAutoConfiguration

    image.png


    image.png

    作者追问:2021-01-26 09:09

    已经优化:https://center.bladex.cn/blade/BladeX-Tool/commit/ccc103f417fad1c262dd069ab7648f970f723442

    你跟着commit修改下然后再测试看看

    回答: 2021-01-26 09:09

    我看了下楼主曾经得回答,配置org.springblade的类底层已经做好自动装配了,在每个目录都有自定义bean,所以springblade根目录无需再次扫描,但是在我们得blade-biz得demo工程里面加了一个如下得config配置(@ComponentScan({"org.springblade","com.example"})),继而影响了原本加载CacheManager得实现名称redisCacheManager得bean我们应该把相应得把她去掉

    @Configuration
    @ComponentScan({"org.springblade","com.example"})
    @EnableFeignClients({"org.springblade", "com.example"})
    @MapperScan({"org.springblade.**.mapper.**", "com.example.**.mapper.**"})
    @EnableConfigurationProperties(DemoProperties.class)
    public class DemoConfiguration {

    }


    回答: 2021-01-26 09:09

    image.png

    image.png

代码语言
提交回复