dchang
dchang

Reputation: 2460

Multiple Bean Instances in Spring

I was wondering if it is possible to specify x amount of the same bean in a list in Spring. For example, instead of having beans with ids: stage1, stage2,... stageN, as here:

<bean id="stage1" class="Stageclass"/>
<bean id="stage2" class="Stageclass"/>

<bean id="stages" class="java.util.ArrayList">
    <constructor-arg>
        <list>
            <ref bean="stage1" />
            <ref bean="stage2" />                
        </list>
    </constructor-arg>
</bean>

Would it be possible to do something like the following?:

<bean id="stage1" class="Stageclass"/>

<bean id="stages" class="java.util.ArrayList">
    <constructor-arg>
        <list>
            <ref bean="stage1" duplicate="20 times"/>
        </list>
    </constructor-arg>
</bean>

Thanks in advance.

Upvotes: 5

Views: 7470

Answers (3)

dchang
dchang

Reputation: 2460

Lookup method injection from http://static.springsource.org/spring/docs/2.5.x/reference/beans.html solved the problem. Just needed to make sure the bean I wanted multiple instances of had scope="prototype"

Upvotes: 2

Petro Semeniuk
Petro Semeniuk

Reputation: 7038

If you use annotation based configuration and you specified list of objects with same interface as dependency for some class then spring will auto-wire aut-wire then for free. Example:

interface StageInterface {
    //...
}

class StageImpl1 implements StageInterface {
    //...
}

class StageImpl2 implements StageInterface {
    //...
}

@Component
class StageContainer {

    private final List<StageInterface> stages;

    @Autowired
    public StageContainer(List<StageInterface> stages) {
        this.stages = stages;
    }

    public List<StageInterface> getStages() {
        return stages;
    }
}

This is a spring version 3+ feature.

I believe the same is possible with xml configuration as well. In your case that's probably will be the same class(StageClass), but with different configuration parameters.

Upvotes: 3

Eugene Kuleshov
Eugene Kuleshov

Reputation: 31795

You can't do that using standard Spring's default namespace. However you can implement your own custom namespace where you could support such syntax.

Alternatively, you can implement a static method that would create an ArrayList instance with duplicated elements.

Upvotes: 1

Related Questions