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

Spring按名称注释

郏博瀚
2023-03-14

我有一个关于Spring注释的问题。在我的(学习)项目中,我定义了两个类,另一个类有两个属性,每种类型一个。为了生成一个错误,我在XML中定义了两个相同类类型的beans,并且在setter方法中使用了@Autowired注释。大概是这样的:

<bean id="classA" class="beans.ClassA"></bean>
<bean id="otherclassA" class="beans.ClassA"></bean>
<bean id="classB" class="beans.ClassB"></bean>
public class UpperClass{
   private ClassA classA;
   private ClassB classB;

   @Autowired 
   public void setClassA(ClassA classA){this.classA = classA}
   @Autowired 
   public void setClassB(ClassB classB){this.classB = classB}

   /* .
      .
      .
    */
}

在主类中,我获取此 Bean 的应用程序上下文的实例,并打印覆盖 toString 方法的属性的内容,这是一个简单的测试。我已经读到Spring自动连线注释按类型查找bean,所以测试应该失败,因为定义了两个ClassA类的bean,但它有效。它还可以使用@Resource注释,而无需在其中使用任何名称。

我使用的是Spring版本4。我已经将bean的id更改为与类/setter名称不匹配,并且它失败了,正如预期的那样。

有人能告诉我为什么吗,或者我做错了什么吗?如果Spring找不到豆子,它会按名称查找吗?

共有1个答案

欧阳嘉
2023-03-14

当有多个bean匹配所需的类型时,Spring将查看方法参数名以解决歧义。IMO这太神奇了,也是避免@Autowired的另一个原因。如果您最终使用了(或不得不处理其他人使用的)此行为,IntelliJ的Spring插件可以很好地确定哪些bean将实际注入自动布线站点。

 类似资料:
  • 我知道有可能通过名字得到一个类,使用 是否可以通过名称检索注释?我尝试了这个: 然后将c转换为

  • 我使用的是Spring Boot1.3,我有下面的配置类: 当我试图按名称注入下面的bean之一时,它抛出:没有定义[java.text.SimpleDateFormat]类型的合格bean:预期的是单个匹配bean,但找到了2:dateAndTimeFormater,DateFormater。 如有任何建议,将不胜感激?

  • 问题内容: 我正在读初春(威利出版社)的书。在第二章中有一个关于Java配置和Java的示例。它提供了这个类 还有这个普通的bean类 当我运行代码时,它可以工作。但是我期待一个异常,因为我在配置中定义了2个具有相同类型的bean。 我意识到它的工作原理是这样的: 如果Spring遇到多个具有相同类型的bean,它将检查字段名称。 如果找到具有目标字段名称的bean,则将该bean注入该字段。 这

  • 我正在读《初春》(威利出版社)的书。在第2章中,有一个关于Java配置和的示例。它提供了这个类 还有这个普通的豆类课 当我运行代码时,它就工作了。但我预期会出现异常,因为我在配置中定义了两个具有相同类型的bean。 我意识到它是这样工作的: 如果Spring遇到多个具有相同类型的bean,它将检查字段名。 这不对吗?Spring对Java配置的处理是否存在缺陷?

  • 我已经通过应用程序配置了我的兔子属性。yaml和spring配置属性。因此,在配置交换、队列和绑定时,可以使用属性的getter 然而,当我配置@RabbitListener从队列登录消息时,我必须使用完整的属性名称,如 我希望避免这种容易出错的硬编码字符串,并参考configurationProperties bean,如: 我曾经遇到过一个与@EventListener类似的问题,在这里使用b

  • 在Springs的最新版本中,我们可以使用注释作为自动连接bean。这将使用bean的类型(或构造函数,如果应用于它的话)自动连接bean。有什么方法可以使用基于bean名称的注释吗?我们在Spring的XML文件中没有注释autowire=“byName”?