具有相同方法名称但不同限定符的 Spring bean 无法加载

Har*_*ary 4 spring

我有两个 Spring Configuration 类定义如下

@Configuration
public class ClsA {

     @Bean
      @Qualifier("ClasA")
      public String getSomething(){
         return "somethingA";
     }
}


@Configuration
public class ClsB {

     @Bean
      @Qualifier("ClsB")
      public String getSomething(){
         return "somethingB";
     }
}
Run Code Online (Sandbox Code Playgroud)

两者具有相同的方法名称。即使限定符不同,应用程序也不会加载,因为它只注入一个,并且在注入另一个的任何地方,如果失败并出现 noBeanDefinition 异常,让我们说 ClsB bean 限定符。

当我保持方法名称不同时,一切都会加载笨拙的多莉。

这种行为正常吗?为什么弹簧不能很好地加载这些 bean,因为它们具有不同的限定符?

Dmi*_*tov 5

@Qualifier注释应该是在注射点可以用来解决歧义哪个bean来注射。但是在示例中,您在 bean 声明站点使用它。在声明站点,您可以通过在@Bean注释中指定每个 bean 来为其命名。因此,如果您使用相同的名称保留方法,则有效示例如下:

@Configuration
public class ClsA {
    @Bean("ClasA")
    public String getSomething() {
        return "somethingA";
    }
}

@Configuration
public class ClsB {
    @Bean("ClasB")
    public String getSomething() {
        return "somethingB";
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ClsB.class, ClsA.class})
public class ClsTest {
    @Autowired
    @Qualifier("ClasA") //this is the place where @Qualifier can be used
    String smthA;

    @Autowired
    @Qualifier("ClasB")
    String smthB;

    @Test
    public void test() {
        System.out.println(smthA);
        System.out.println(smthB);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

somethingA
somethingB
Run Code Online (Sandbox Code Playgroud)