injection framework dependency context bean application annotation java spring dependency-injection

java - dependency - spring framework



primavera: establecer la propiedad de un frijol leyendo la propiedad de otro frijol? (3)

¿Es posible establecer la propiedad de un bean leyendo la propiedad de otro bean? Por ejemplo, supongamos que tengo:

class A { void setList(List list); } class B { List getList(); }

Me gustaría que Spring cree una instancia de ambas clases y llame al método setList de A, pasando el resultado de llamar al método getList de B. La configuración de Spring podría verse algo como:

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

Por desgracia, este XML inventado no funciona.

¿Por qué no inyectar B en A? Porque no quiero introducir la dependencia extra. A es solo Lista dependiente, no en B.


Además de la respuesta de @Kevin, si está utilizando Spring 3.0, es posible hacerlo con el nuevo lenguaje de expresión Spring.

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

documentación de primavera 3.0


Hay un par de maneras. Aqui hay 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>

También vea el elemento <util:property-path/>


Si está intentando hacer lo mismo para un constructor, haga esto.

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

Aquí "jdbc" es como se menciona a continuación que tiene la propiedad "dataSource" con getter y setter y se inicia como:

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