问题分析

该错误表明Spring容器中出现了同名Bean的冲突,apiLogService在ApiServiceConfiguration.class和ApiLogService.class中被重复定义,且Spring默认禁止覆盖Bean定义。

解决方法一:启用Bean覆盖

在application.properties或application.yml中启用Bean覆盖功能:

spring.main.allow-bean-definition-overriding=true

或YAML格式:

spring:
  main:
    allow-bean-definition-overriding: true

此方法快速但可能掩盖潜在的组件设计问题。

解决方法二:修改Bean名称

为冲突的Bean指定不同的名称。在配置类中使用显式命名:

@Bean("customApiLogService")
public ApiLogService apiLogService() {
    return new ApiLogService();
}

或在服务类上使用自定义注解:

@Service("customApiLogService")
public class ApiLogService { ... }

解决方法三:组件扫描排除

如果不需要自动扫描某个Bean,可通过排除解决:

@ComponentScan(excludeFilters = @ComponentScan.Filter(
    type = FilterType.ASSIGNABLE_TYPE,
    classes = ApiLogService.class))

解决方法四:重构设计

检查是否真的需要两个相同类型的Bean:

  • 合并重复的服务类
  • 使用@Primary注解指定主Bean
  • 通过@Qualifier进行精确注入

注意事项

  • 生产环境建议优先采用重命名或重构方案
  • 启用覆盖功能可能导致不可预期的依赖注入行为
  • 检查构建工具是否重复编译了相同类文件

更多推荐