当前位置: 首页 > 知识库问答 >
问题:

方法名相同但限定符不同的春豆加载失败

蒯胜泫
2023-03-14

我有两个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";
     }
}

两者都有相同的方法名。即使限定符不同,应用程序也不会加载,因为它只注入一个限定符,无论另一个限定符注入到哪里,如果失败,就会出现noBeanDefinition异常,比如说ClsB bean限定符。

当我保持方法名不同时,所有内容都加载得很好。

这种行为正常吗?为什么spring不能加载这些beans,因为它们有不同的限定符?

共有2个答案

公孙锋
2023-03-14

每个bean名称必须是唯一的。

  • 1.3.1.命名Beans
  • 1.12.3。使用@Bean注释
@Configuration
public class ClsA {

    @Bean("clasAText")
    public String getSomething() {
        return "somethingA";
    }
}
@Configuration
public class ClsB {

    @Bean("clsBText")
    public String getSomething() {
        return "somethingB";
    }
}
  • 1.10.5. 在组件中定义 Bean 元数据
java prettyprint-override">@Configuration
public class ClsA {

    @Bean("clasAText")
    @Qualifier("clsA")
    public String getSomething() {
        return "somethingA";
    }
}
@Configuration
public class ClsB {

    @Bean("clsBText")
    @Qualifier("clsB")
    public String getSomething() {
        return "somethingB";
    }
}
  • 1.9.7.注入@Resource
@Component
public class MyComponent {

    @Resource(name = "clasAText")
    private String text;

    // ...
}

注意:

如果您打算通过名称来表达注释驱动的注入,请不要主要使用< code>@Autowired (snip)。相反,使用JSR-250 @Resource注释

  • 1.9.4.使用限定符微调基于注释的自动布线

如果添加了限定符,则这些限定符可用。

@Component
public class MyComponent {

    @Autowired
    @Qualifier("clsA")
    private String text;

    // ...
}

这个答案是一种回退行为。名称和限定符是不同的。

  • 1.9.4.使用限定符微调基于注释的自动布线

对于回退匹配,bean名称被视为默认限定符值。

薛博赡
2023-03-14

@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);
    }
}

输出:

somethingA
somethingB
 类似资料:
  • 我可以看到它不工作,因为我尝试了它。我只是无法解释为什么一定要这样。 第二个方法来自一个类,该类是实现第一个getValue()方法的类的子类。 为什么同名不足以覆盖该方法?我想到的唯一论点是,它将反对“是一个”关系,因为用A扩展的第二个方法的类必须具有与A相同的能力,如果你重写返回类型,你就打破了那个法律,对吧?

  • 问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文

  • 但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 我说的是Java,但这个概念也适用于其他语言-- 我们在同一个类上有两个方法,它们具有相同的基本功能,但提供不同的返回类型。这两种方法都会给你所有的东西,但一个得到一个可以提供对所有东西的访问的可迭代的,一个得到一个包含所有东西的集合。 我们知道你不能这样做(因为它不会编译): 那么,有人想过如何命名这些方法吗?这似乎是一个简单的解决方法: 然而,这显然有些冗长,可能不是最好的解决方案。我问的这个

  • 问题内容: 我喜欢基于构造函数的注入,因为它允许我进行注入的字段。我还喜欢注释驱动的注入,因为它简化了我的操作。只要没有两个相同类型的参数,就可以用标记构造函数,并且一切正常。例如,我有一个课: 以及具有以下内容的应用程序上下文: 应该有一种在类的构造函数上指定bean ID的方法,但是我在文档中找不到它。是否有可能,或者我是否梦想着不存在的解决方案? 问题答案: 是按类型(在这种情况下);用于按

  • 问题内容: 我有一个Animal类和一个名为AnimalExtension的Animal扩展。 这两个类之间的唯一区别是AnimalExtension还有另一个实例变量叫做animalId。Animal没有此实例变量。 我也有自己的数据类型,想要对XML进行封送处理。此数据类型称为AnimalList。在AnimalList内,有一个Animals列表作为实例变量。 animalList可以包含A

  • 我在一次面试中被问到以下问题: 问题:名称和签名相同但返回类型不同的方法。他问我,可能吗?这种类型叫什么。 有人能告诉我以下情况吗: > 上面的事情在任何情况下都是可能的(至少像一个在基类中,一个在派生类中?)如果是,是什么类型?比如编译或运行时多态? 在编译时多态性中,如果方法的返回类型与签名也不同,该怎么办?但只有函数的名称是相同的。还是编译时多态性吗? 在重写中,如果我有不同的返回类型,但方