The bean ‘redisTemplate‘, defined in class path resource

目录

1. bug描述

2. 出现的原因

3. 解决方式


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") 来控制不再做加载


The bean ‘redisTemplate‘, defined in class path resource_第1张图片

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 {

你可能感兴趣的:(java,spring,spring,boot)