You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Spring中@Qualifier注解首字母小写的限制问题?

问题解决:Spring中同名Bean冲突与@Qualifier限制绕过

问题根源

你遇到的冲突并非@Qualifier的首字母小写限制,而是Spring默认Bean命名策略导致的:
Spring会自动将类名首字母转为小写作为默认Bean名称。因此Haskell类的默认Bean名是haskell,而你同时定义了一个名为haskell的类,它的默认Bean名也是haskell,两个Bean重名才引发了ConflictingBeanDefinitionException。

解决方案

核心是给每个Bean指定唯一的自定义标识,以下是两种可行方式:

方式1:直接在@Component中指定Bean名称

修改两个类的@Component注解,分别设置不同的Bean名:

  • Haskell.java:
@Component("haskellUpper")
public class Haskell implements Language {
    @Override
    public String name() {
        return "Haskell";
    }
}
  • haskell.java:
@Component("haskellLower")
public class haskell implements Language {
    @Override
    public String name() {
        return "haskell";
    }
}

注入时通过@Qualifier使用自定义名称:

@Autowired
public DITestRestController(@Qualifier("haskellUpper") Language language) {
    this.language = language;
}

方式2:使用自定义限定符注解

如果需要更清晰的语义区分,可以自定义限定符注解:

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface UpperHaskell {}
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface LowerHaskell {}

给对应类添加自定义注解:

@Component
@UpperHaskell
public class Haskell implements Language {
    // 实现代码
}
@Component
@LowerHaskell
public class haskell implements Language {
    // 实现代码
}

注入时直接使用自定义注解:

@Autowired
public DITestRestController(@UpperHaskell Language language) {
    this.language = language;
}

内容的提问来源于stack exchange,提问作者kesarling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:12:13