Wednesday, April 25, 2012

How to define a List bean in Spring?


I'm using Spring to define stages in my application. It's configured that the necessary class (here called Configurator ) is injected with the stages.





Now I need the List of Stages in another class, named LoginBean . The Configurator doesn't offer access to his List of Stages.



I cannot change the class Configurator .



My Idea:

Define a new bean called Stages and inject it to Configurator and LoginBean . My problem with this idea is that I don't know how to transform this property:




<property ...>
<list>
<bean ... >...</bean>
<bean ... >...</bean>
<bean ... >...</bean>
</list>
</property>



into a bean.



Something like this does not work:




<bean id="stages" class="java.util.ArrayList">



Can anybody help me with this?


Source: Tips4all

5 comments:

  1. Would this work for you?

    <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>

    ReplyDelete
  2. import the spring util namespace then you can define a list bean like so:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">


    <util:list id="myList" value-type="java.lang.String">
    <value>foo</value>
    <value>bar</value>
    </util:list>




    the value-type is the generics type to be used, and is optional. Yuo can also specify the list impementatino class using the attribute 'list-class'

    HTH

    ReplyDelete
  3. I think you may be looking for org.springframework.beans.factory.config.ListFactoryBean.

    You declare a ListFactoryBean instance, providing the list to be instantiated as a property withe a <list> element as its value, and give the bean an id attribute. Then, each time you use the declared id as a ref or similar in some other bean declaration, a new copy of the list is instantiated. You can also specify the List class to be used.

    ReplyDelete
  4. Stacker posed a great answer, I would go one step farther to make it more dynamic and use Spring 3 EL Expression.

    <bean id="listBean" class="java.util.ArrayList">
    <constructor-arg>
    <value>#{springDAOBean.getGenericListFoo()}</value>
    </constructor-arg>
    </bean>


    I was trying to figure out how I could do this with the util:list but couldn't get it work due to conversion errors.

    ReplyDelete
  5. Use the util namespace, you will be able to register the list as a bean in your application context. You can then reuse the list to inject it in other bean definitions.

    ReplyDelete