Весна-впрысните 2 фасоли такого же типа


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

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

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

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

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

1 54

1 ответ:

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

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

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

(ниже этого текста приведен полный пример)