The bean ‘redisTemplate‘, defined in class path resource
The bean 'redisTemplate', defined in class path resource [**/**/**/**/RedisTemplateAutoConfiguration.class], could not be registered. A bean with that name has already been defined in class path resou
目录
1. bug描述
The bean 'redisTemplate', defined in class path resource [com/kone/sp/common/redis2/config/RedisTemplateAutoConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration.class] and overriding is disabled.
问题出现在我自定义 reids-starter 的时候
2. 出现的原因
错误的原因是, springboot 在启动时会优先加载 springboot 框架自带的 spring.factories 文件中的定义的自动配置类, 把框架原本的 redisTemplate 作为 bean 注入到 容器中, 之后才会加载我们自定义的 RedisTemplateAutoConfiguration, 并且再次把我们魔改过 redisTemplate 注入到 bean 中, 这样容器中出现了2个名字一样的 redisTemplate, 所以会出现上述的错误
我们自定义的 redis-starter 的目的是想让框架加载我们魔改后的 redisTemplate, 结合源码发现, 框架只会在缺失 redisTemplate 这个 bean 的时候才会加载框架自带的 redisTemplate, 源码位置 : org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
所以我们可以使用 @AutoConfigureBefore(RedisAutoConfiguration.class) 这个注解, 让框架优先加载我们自定义的 redisTemplate, 并注入到容器中, 之后框架在加载原本的 RedisAutoConfiguration 时候, 通过注解 @ConditionalOnMissingBean(name = "redisTemplate") 来控制不再做加载
3. 解决方式
在我们自定义的 starter 类上, 使用 @AutoConfigureBefore(RedisAutoConfiguration.class) 注解, 告诉框架优先加载我们自定义的 starter, 之后框架会通过注解 @ConditionalOnMissingBean(name = "redisTemplate") 来控制不再加载原本的 redisTemplate
SpringBoot自定义spring-boot-redis-starter_canxiusi的博客-CSDN博客
@AutoConfigureBefore(RedisAutoConfiguration.class)
@PropertySource(value = "classpath:sp-redis.properties")
@EnableConfigurationProperties({RedisTemplateConfigProperties.class}) // 依赖配置文件
public class RedisTemplateAutoConfiguration {
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)