Come si accede a una proprietà di un bean per la lettura in un file di configurazione XML primavera?

StackOverflow https://stackoverflow.com/questions/142740

  •  02-07-2019
  •  | 
  •  

Domanda

Voglio fare qualcosa del genere in primavera:

<beans>
    ...
    <bean id="bean1" ... />
    <bean id="bean2">
        <property name="propName" value="bean1.foo" />
...

Penserei che questo acceda al metodo getFoo () di bean1 e chiami il metodo setPropName () di bean2, ma questo non sembra funzionare.

È stato utile?

Soluzione

Cosa ho capito:

  1. Hai un bean (bean1) con a proprietà chiamata " foo "
  2. Hai un altro bean (bean2) con a proprietà denominata " propName " ;, che anche deve avere lo stesso "pippo" quello dentro bean1.

perché non farlo:

<beans>
...
<bean id="foo" class="foopackage.foo"/>
<bean id="bean1" class="foopackage.bean1">
  <property name="foo" ref="foo"/>
</bean> 
<bean id="bean2" class="foopackage.bean2">
  <property name="propName" ref="foo"/>
</bean>
....
</beans>

In questo modo, il tuo bean2 non è accoppiato al bean1 come nel tuo esempio. Puoi cambiare bean1 e bean2 senza influire a vicenda.

Se DAVVERO devi fare l'iniezione che hai proposto, puoi usare:

<util:property-path id="propName" path="bean1.foo"/>

Altri suggerimenti

Devi usare PropertyPathFactoryBean :

    <bean id="bean2" depends-on="bean1">
        <property name="propName">
            <bean class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
                <property name="targetBeanName" value="bean1"/>
                <property name="propertyPath" value="foo"/>
            </bean>
        </property>
    </bean>

Penso che devi iniettare bean1, quindi ottenere pippo manualmente a causa di un problema di temporizzazione. Quando il framework risolve il valore del bean target?

È possibile creare un bean puntatore e configurarlo.

class SpringRef {
  private String targetProperty;
  private Object targetBean;

  //getters/setters

  public Object getValue() {
    //resolve the value of the targetProperty on targetBean. 
  }
}

Common-BeanUtils dovrebbe essere utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top