Domanda

È possibile impostare la proprietà di un bean leggendo la proprietà di un altro bean? Ad esempio, supponiamo che avessi:

class A {
   void setList(List list);
}

class B {
   List getList();
}

Vorrei che Spring istanziasse entrambe le classi e chiamasse il metodo setList di A, passando il risultato della chiamata del metodo getList di B. La configurazione di Spring potrebbe essere simile a:

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

Purtroppo, questo XML inventato non funziona.

Perché non iniettare semplicemente B in A? Perché non voglio introdurre la dipendenza aggiuntiva. A è solo Elenco dipendente, non su B.

È stato utile?

Soluzione

oltre alla risposta di @ Kevin se si utilizza la primavera 3.0, è possibile farlo con il nuovo linguaggio delle espressioni primaverili

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

documentazione della primavera 3.0

Altri suggerimenti

Ci sono un paio di modi. Eccone uno:

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

Vedi anche <util:property-path/> elemento

Se stai provando a fare lo stesso per un costruttore, fallo.

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

Qui " jdbc " è come menzionato di seguito che ha la proprietà " dataSource " con getter e setter e inizializzato come:

<bean id="jdbc" class="com.la.activator.DataSourceProvider">
    <property name="myDataSourcePool" ref="dsPoolService"/>
</bean>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top