Spring -- inject 2 beans of same type

JavaSpring

Java Problem Overview


I like constructor-based injection as it allows me to make injected fields final. I also like annotation driven injection as it simplifies my context.xml. I can mark my constructor with @Autowired and everything works fine, as long as I don't have two parameters of the same type. For example, I have a class:

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

and an application context with:

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

There should be a way to specify the bean ID on the constructor of the class SomeClass, but I can't find it in the documentation. Is it possible, or am I dreaming of a solution that does not exist yet?

Java Solutions


Solution 1 - Java

@Autowired is by-type (in this case); use @Qualifier to autowire by-name, following the example http://static.springsource.org/spring/docs/2.5.x/reference/beans.html">from spring docs:

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

> Note: In contrast to @Autowired which is applicable to fields, constructors and multi-argument methods (allowing for narrowing through qualifier annotations at the parameter level), @Resource is only supported for fields and bean property setter methods with a single argument. As a consequence, stick with qualifiers if your injection target is a constructor or a multi-argument method.

(below that text is the full example)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGuillaumeView Question on Stackoverflow
Solution 1 - JavaBozhoView Answer on Stackoverflow