2016-03-23 1 views
7

У меня есть несколько бобов одного и того же класса, определенного:Как autowire по имени весной с аннотациями?

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

поэтому, когда я autowire их

@Autowired 
    public FieldDescriptor fullSpotField; 

    @Autowired 
    public FieldDescriptor annotationIdField; 

я получаю исключение

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

Как autowire по имени, как это возможно в конфигурации XML?

ответ

19

Для решения этой проблемы вы можете использовать @Qualifer.

В вашем случае вы можете сделать:

@Bean 
@Qualifier("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 
    @Qualifier("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; 
+2

Я обнаружил, что '@ Qualifier' не требуется рядом методы создания боба, достаточно добавьте эту аннотацию вместе с '@ Autowired' – Dims

+0

@Dims Вы правы. Если в методе создания бина не задан «Квалификатор», он принимает имя метода ex, «fullSpotField» в качестве имени квалификатора для первого компонента. –