【问题标题】:How to autowire by name in Spring with annotations?如何在带有注释的 Spring 中按名称自动装配?
【发布时间】:2016-03-23 16:27:27
【问题描述】:

我定义了几个相同类的bean:

  @Bean
  public FieldDescriptor fullSpotField() {
     FieldDescriptor ans = new FieldDescriptor("full_spot", String.class);
     return ans;
  }

  @Bean
  public FieldDescriptor annotationIdField() {
     FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class);
     return ans;
  }

因此当我自动连接它们时

   @Autowired
   public FieldDescriptor fullSpotField;

   @Autowired
   public FieldDescriptor annotationIdField;

我遇到了异常

NoUniqueBeanDefinitionException: No qualifying bean of type [...FieldDescriptor] is defined: expected single matching bean but found ...

如何在 XML 配置中尽可能按名称自动装配?

【问题讨论】:

    标签: java spring autowired


    【解决方案1】:

    你可以使用@Qualifier来解决。

    在你的情况下,你可以:

     @Bean(name="fullSpot")
     // Not mandatory. If not specified, it takes the method name i.e., "fullSpotField" as qualifier name.
      public FieldDescriptor fullSpotField() {
         FieldDescriptor ans = new FieldDescriptor("full_spot", String.class);
         return ans;
      }
    
      @Bean("annotationIdSpot")
      // Same as above comment.
      public FieldDescriptor annotationIdField() {
         FieldDescriptor ans = new FieldDescriptor("annotationID", Integer.class);
         return ans;
      }
    

    随后您可以使用以下方法进行注入:

       @Autowired
       @Qualifier("fullSpot")
       public FieldDescriptor fullSpotField;
    
       @Autowired
       @Qualifier("annotationIdSpot")
       public FieldDescriptor annotationIdField;
    

    【讨论】:

    • 我发现在bean创建方法附近不需要@Qualifier,只要加上@Autowired这个注解就足够了
    • @Dims 你是对的。如果在 bean 创建方法中没有指定 Qualifier ,则它将方法名称 ex, "fullSpotField" 作为第一个 bean 的限定符名称。
    • 有用的提示,你可以将其中一个 bean 标记为 @Primary,如果你不想在你的每一个 bean 上都加上一个@Qualifier。它将默认为@Primary 如果没有@Qualifier
    【解决方案2】:

    这是一个非常简单的“按名称自动装配”案例 bean 自己注册到容器中,但在使用按名称自动装配时可能需要构造函数注入。

    你可以像这样继续尝试, 无论您在哪里自动装配上面指定的 2 个 bean,

    class ExampleClass {
        @Autowired
        public FieldDescriptor fullSpotField;
    
        @Autowired
        public FieldDescriptor annotationIdField;
    
        public ExampleClass(FieldDescriptor fullSpotField,FieldDescriptor annotationIdField ){
            super();
            this.fullSpotField = fullSpotField;
            this.annotationIdField = annotationIdField;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2014-09-29
      相关资源
      最近更新 更多