Come si accede a una proprietà di un bean per la lettura in un file di configurazione XML primavera?
-
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.
Soluzione
Cosa ho capito:
- Hai un bean (bean1) con a proprietà chiamata " foo "
- 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.