primavera: imposta la proprietà di un bean leggendo la proprietà di un altro bean?
-
05-07-2019 - |
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.
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>
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>