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
Would this work for you?
ReplyDelete<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>
import the spring util namespace then you can define a list bean like so:
ReplyDelete<?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
I think you may be looking for org.springframework.beans.factory.config.ListFactoryBean.
ReplyDeleteYou 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.
Stacker posed a great answer, I would go one step farther to make it more dynamic and use Spring 3 EL Expression.
ReplyDelete<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.
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