Landon Kuhn
Landon Kuhn

Reputation: 78511

spring: set property of one bean by reading the property of another bean?

Is it possible to set the property of one bean by reading the property of another bean? For instance, suppose I had:

class A {
   void setList(List list);
}

class B {
   List getList();
}

I would like Spring to instantiate both classes, and call A's setList method, passing in the result of calling B's getList method. The Spring configuration might look something like:

<bean id="b" class="B"/>
<bean id"a" class="A">
    <property name="list" ref="b" ref-property="list"/>
</bean>

Alas, this made-up XML does not work.

Why not just inject B into A? Because I do not want to introduce the extra dependency. A is only dependent List, not on B.

Upvotes: 28

Views: 42940

Answers (3)

Rupesh
Rupesh

Reputation: 2667

If you are trying to do the same for a constructor then do this.

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <constructor-arg type="javax.sql.DataSource" value="#{jdbc.dataSource}">            
            </constructor-arg>
</bean>

Here "jdbc" is as mentioned below that has property "dataSource" with getter and setter and initilized as:

<bean id="jdbc" class="com.la.activator.DataSourceProvider">
    <property name="myDataSourcePool" ref="dsPoolService"/>
</bean>

Upvotes: 2

Gareth Davis
Gareth Davis

Reputation: 28069

in addition to @Kevin's answer if you are using spring 3.0 it is possible to do this with the new spring expression language

<bean id="a" class="A">
    <property name="list"
        value="#{b.list}"/>
</bean>

spring 3.0 documentation

Upvotes: 51

Kevin
Kevin

Reputation: 30449

There are a couple of ways. Here is one:

<bean id="b" class="B"/>
<bean id="a" class="A">
    <property name="list">
        <bean class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
            <property name="targetObject" ref="b"/>
            <property name="propertyPath" value="list"/>
        </bean>
    </property>
</bean>

Also see the <util:property-path/> element

Upvotes: 18

Related Questions