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

Blade 已结 2 1447
黄大仙
黄大仙 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

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

提交回复