Подтвердить что ты не робот

Spring: установить свойство одного bean, прочитав свойство другого bean?

Можно ли установить свойство одного bean, прочитав свойство другого bean? Например, предположим, что у меня было:

class A {
   void setList(List list);
}

class B {
   List getList();
}

Я хотел бы, чтобы Spring создавал экземпляры обоих классов и вызывал метод setList, передавая результат вызова метода B getList. Конфигурация Spring может выглядеть примерно так:

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

Увы, этот готовый XML не работает.

Почему бы просто не ввести B в A? Потому что я не хочу вводить дополнительную зависимость. A - это только зависимый список, а не B.

4b9b3361

Ответ 1

в дополнение к ответу @Kevin, если вы используете spring 3.0, это можно сделать с помощью нового языка выражения spring

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

spring 3.0 документация

Ответ 2

Есть несколько способов. Вот один из них:

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

Также см. <util:property-path/> элемент

Ответ 3

Если вы пытаетесь сделать то же самое для конструктора, тогда сделайте это.

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

Здесь "jdbc", как упоминалось ниже, имеет свойство "dataSource" с геттером и установщиком и инициализируется как:

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