简体   繁体   中英

How to autowire by name in Spring with annotations?

I have several beans of the same class defined:

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

consequently when I autowire them

   @Autowired
   public FieldDescriptor fullSpotField;

   @Autowired
   public FieldDescriptor annotationIdField;

I get an exception

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

How to autowire by name as it possible in XML config?

You can use @Qualifier to solve it.

In your case you can make:

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

and subsequently you can inject using:

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

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

Its a very simple case of "Autowiring By Name" beans gets registered into the container by itself, but might require the constructor injection when using autowiring by name.

You can go ahead and try like this, Where ever you are autowiring the 2 beans which are specified above,

class ExampleClass {
    @Autowired
    public FieldDescriptor fullSpotField;

    @Autowired
    public FieldDescriptor annotationIdField;

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM