2010-01-28 5 views
48

Мне нравится инъекция на основе конструктора, так как она позволяет мне вводить поля с впрысками final. Мне также нравится вложение, связанное с аннотацией, поскольку оно упрощает мой context.xml. Я могу отметить свой конструктор @Autowired, и все работает отлично, если у меня нет двух параметров одного типа. Например, у меня есть класс:Весна - впрысните 2 бобы того же типа

@Component 
public class SomeClass { 
    @Autowired(required=true) 
    public SomeClass(OtherClass bean1, OtherClass bean2) { 
     … 
    } 
} 

и контекст приложения с:

<bean id="bean1" class="OtherClass" /> 
<bean id="bean2" class="OtherClass" /> 

Там должен быть способ указать боб ID на конструктор класса SomeClass, но я могу» t найти его в документации. Возможно ли, или я мечтаю о решении, которое еще не существует?

ответ

72

@Autowired является по типу (в данном случае); использовать @Qualifier к autowire по имени, следуя примеру from spring docs:

public SomeClass(
    @Qualifier("bean1") OtherClass bean1, 
    @Qualifier("bean2") OtherClass bean2) { 
    ... 
} 

Примечание: В отличие от @Autowired, который применим к полям, конструкторов и методов мульти-аргументов (с учетом сужения через квалификационных аннотации на уровень параметра), @Resource поддерживается только для полей и методов настройки свойств компонента с единственным аргументом. Как следствие, придерживайтесь квалификаторов, если ваша цель внедрения - это конструктор или метод с несколькими аргументами.

(ниже текст является полным примером)

+2

'@ Autowire' является по имени тоже, но в этом случае вам необходимо предоставить сеттер. Но здесь аргументы конструктора предпочтительнее, и '@ Autowire' не будет работать, если оба args одного типа. Следовательно, вещь может быть решена с помощью '@ Qualifier'. –

+0

разъяснил ответ. – Bozho

+0

Заметил ....... + 1 –

Смежные вопросы