@configuration类未被扫描的直接原因是其所在包不在主启动类的同级或子包内,导致spring容器无法发现并加载该配置类;需检查包路径、排除@componentscan误配置、@profile激活状态及编译输出中class文件是否存在。

为什么@Configuration类没被扫描到
Spring Boot启动时根本没执行你的@Configuration类,不是配置写错了,是它压根没进容器。最常见原因是类不在组件扫描路径下,或者被@ComponentScan显式排除了。
- 检查该类所在包是否在主启动类(带
@SpringBootApplication的类)的同级或子包内;如果不是,必须用@ComponentScan(basePackages = "com.example.config")显式指定 - 确认类上只有
@Configuration,不要同时加@Component——这会导致重复注册,部分版本会静默忽略 - 如果用了
@Profile(比如@Profile("prod")),而当前激活的是dev,这个类会被跳过,启动日志里也不会报错,只会安静消失 - IDE 编译输出目录(如
target/classes)中检查该类的 class 文件是否存在,避免因编译失败或 Maven 资源过滤误删
redisTemplate Bean 创建失败的直接原因
BeanCreationException: Error creating bean with name 'redisTemplate' 这类报错,90% 不是配置类问题,而是依赖链断裂。Spring Boot 在创建 redisTemplate 前,必须先创建 RedisConnectionFactory,而后者又强依赖客户端驱动和序列化支持。
- 缺少
spring-boot-starter-data-redis依赖:这是最隐蔽的坑——Maven 不报错,但运行时找不到RedisAutoConfiguration类,整个 Redis 自动装配流程不会触发 - Jackson 依赖缺失:若你自定义了
GenericJackson2JsonRedisSerializer,却没引入jackson-databind,redisTemplate实例化会在反射调用序列化器构造器时抛NoClassDefFoundError - 手动 new 出的
JedisConnectionFactory或LettuceConnectionFactory没设setHostName()/setPort(),且未通过@Value注入配置,会导致连接参数为 null,最终报Unable to connect to null:0
配置项不生效:spring.redis.host 被忽略
明明写了 spring.redis.host=192.168.1.100,日志却显示连 localhost:6379,说明自动配置没读到你的值。这不是 YAML 写法问题,而是配置加载时机或覆盖逻辑出了岔子。
- 确认配置文件是
application.yml(注意缩进)或application.properties,且位于src/main/resources下;application-dev.yml这类 Profile 专用文件需配合spring.profiles.active=dev - 若使用 Nacos、Apollo 等远程配置中心,
RedisAutoConfiguration的执行早于远程配置拉取完成,此时它只能读到空值,于是 fallback 到默认 localhost —— 解决方案是加@ConditionalOnProperty(name = "spring.redis.host")控制自动配置启用时机,或改用InitializingBean延后初始化 - 检查是否有其他地方(如
@TestConfiguration、父 POM 的dependencyManagement)强制指定了lettuce-core版本,导致 Spring Boot 2.x/3.x 的自动配置类被跳过(不同版本的RedisAutoConfiguration条件注解不同)
自定义配置类与自动配置冲突的典型表现
你以为自己写了 @Bean 就能接管一切,但 Spring Boot 的自动配置有优先级机制。如果你的类名是 RedisConfig,又没加任何条件控制,很可能和 RedisAutoConfiguration 形成竞争,结果是其中一个被 @ConditionalOnMissingBean 排除,而你还不知道。
- 不要直接命名类为
RedisConfig或RedisAutoConfiguration,避免触发条件匹配歧义 - 若想完全替代自动配置,应在类上加
@EnableAutoConfiguration(exclude = RedisAutoConfiguration.class),否则 Spring Boot 会尝试合并两个RedisConnectionFactoryBean,报NoUniqueBeanDefinitionException - 用
@ConditionalOnMissingBean(name = "redisTemplate")包裹自定义redisTemplate方法,比单纯加@Bean更安全;否则可能因自动配置已创建了同名 Bean,你的方法被跳过 - 启动时加
--debug参数,查看日志中ConditionEvaluationReport部分,明确看到哪些自动配置被“matched”、哪些被“excluded”,这是定位冲突的唯一可靠方式











