直接查看启动日志中的ConflictingBeanDefinitionException或BeanDefinitionOverrideException,可明确获知冲突Bean名称、两个类的完整包路径和类型;再通过堆栈定位来源、检查自动配置、清理class文件、使用@ConditionalOnMissingBean控制注册逻辑来解决。

直接看启动日志里的 ConflictingBeanDefinitionException 或 BeanDefinitionOverrideException,它会明确告诉你冲突的 Bean 名称、两个类的完整包路径和类型。这是最准的起点。
查清冲突 Bean 的来源
Spring 启动时扫描所有 classpath 下的类,第三方 jar 包里的 @Component/@Service 类也会被加载。你需要确认:哪个 Bean 来自你写的代码,哪个来自哪个依赖包。
- 在异常堆栈里找到两个类的全限定名(比如
com.example.service.UserService和org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration) - 用 IDEA 右键 → “Go to Declaration” 跳转到类定义,看它是否在
Maven Dependencies下(说明是第三方 jar 提供的) - 或者在终端执行:
mvn dependency:tree | grep -A5 -B5 "your-bean-class-name",辅助定位引入该类的依赖路径
检查是否启用了自动配置
很多冲突其实来自 Spring Boot 的 auto-configuration。比如你写了 @Service RedisService,但 spring-boot-starter-data-redis 也自动配了一个同名 Bean。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 查看异常中提到的类是否属于
xxxAutoConfiguration类(如JacksonAutoConfiguration、RedisAutoConfiguration) - 在
application.properties中临时禁用可疑的自动配置,验证是否解决冲突:spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration - 如果禁用后启动成功,就确认是它引起的,后续可选择覆盖、排除或重命名
检查 classpath 是否混入旧版 class 文件
有时候你以为删掉了某个类,但 target/classes 或 IDE 缓存里还残留着旧编译结果,导致 Spring 扫描到“两个同名类”。
- 执行
mvn clean,并手动删掉项目根目录下的target文件夹 - 在 IDEA 中点击
Build → Clean Project,再Build → Rebuild Project - 检查
target/classes目录下是否存在两个不同包路径但类名相同的 .class 文件(例如com.old.UserService.class和com.new.UserService.class)
用 @ConditionalOnMissingBean 控制注册逻辑
如果你的自定义 Bean 是想“兜底”或“替代”第三方默认实现,推荐在配置类中用 @Bean + @ConditionalOnMissingBean 显式声明,而不是依赖组件扫描。
- 把你的实现写成配置方法,加上条件注解:
public class MyBeanConfig {
@Bean
@ConditionalOnMissingBean(UserService.class)
public UserService myUserService() {
return new MyUserServiceImpl();
}
}
- 这样 Spring 会先检查容器里有没有 UserService 类型的 Bean,没有才注册你的;有则跳过,避免硬冲突

















