如何解决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
相关产品推荐
相关产品推荐

