spring: установить свойство одного компонента путем чтения свойства другого компонента? - PullRequest
28 голосов
/ 21 октября 2009

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

class A {
   void setList(List list);
}

class B {
   List getList();
}

Я бы хотел, чтобы Spring создавал экземпляры обоих классов и вызывал метод setList A, передавая результат вызова метода getList B. Конфигурация 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.

Ответы [ 3 ]

49 голосов
/ 21 октября 2009

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

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

пружина 3.0, документация

18 голосов
/ 21 октября 2009

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

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

2 голосов
/ 17 апреля 2013

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

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

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

<bean id="jdbc" class="com.la.activator.DataSourceProvider">
    <property name="myDataSourcePool" ref="dsPoolService"/>
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...