2009-10-21 18 views
23

¿Es posible establecer la propiedad de un bean leyendo la propiedad de otro bean? Por ejemplo, supongamos que tenía:spring: establece la propiedad de un bean leyendo la propiedad de otro bean?

class A { 
    void setList(List list); 
} 

class B { 
    List getList(); 
} 

me gustaría primavera para crear instancias de ambas clases, y llamar al método lista de canciones de A, que pasa en el resultado de la llamada al método de getList B. La configuración de Spring puede ser similar a:

<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 solo inyectar B en A? Porque no quiero introducir la dependencia adicional. A solo es una lista dependiente, no en B.

+0

Puesto que usted tiene una mejor respuesta, habría que considerar el cambio de su aceptación? – Thom

Respuesta

46

<util:property-path/> además de @ respuesta de Kevin si está utilizando la primavera 3.0 es posible hacer esto con el nuevo lenguaje de expresión de primavera

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

spring 3.0 documentation

+0

dulce, eso es genial. Ojalá estuviera usando la primavera 3. –

+0

¡excelente, eso es exactamente lo que necesito! –

+0

¿Hay alguna manera de anotación amigable de hacer esto sin SPEL? – coderatchet

18

Hay un par de formas. Aquí está 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> 

Véase también el elemento

2

Si está intentando hacer lo mismo con 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 más adelante que tiene la propiedad "origen de datos" con getter y setter y initilized como:

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