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

Blade 已结 2 1465
黄大仙
黄大仙 剑圣 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条回答
  •  admin
    admin (最佳回答者)
    2021-01-25 15:09

    JwtRedisConfiguration有@Order注解的,也就是说他会最后加载,而BladeRedisCacheAutoConfiguration没有这个注解,不会最后加载。

    他俩都有@AutoConfigureAfter(RedisAutoConfiguration.class),主要就是看@Order注解了。

    如果两个依赖都引入,那最先实例化的应该是BladeRedisCacheAutoConfiguration才对。


    如果你找不出问题,把你的新工程精简一下,只留关键配置,然后打包上传到本帖,我下载调试看看是哪里的问题

    作者追问:2021-01-25 15:09

    主要是看到两者注解不一样呢,一个是before一个是after

    BladeRedisCacheAutoConfiguration使用的是@AutoConfigureAfter(RedisAutoConfiguration.class)

    JwtRedisConfiguration使用的是@AutoConfigureBefore(RedisAutoConfiguration.class)


    我再去简化精简下看看效果


    作者追问:2021-01-25 15:09

    麻烦老铁看下第二个回复呢

    0 讨论(1)
  • 2021-01-26 09:09

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

    image.png


    image.png

    作者追问:2021-01-28 16:24

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

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

    回答: 2021-01-29 09:42

    我看了下楼主曾经得回答,配置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-29 09:45

    image.png

    image.png

    0 讨论(0)
提交回复