¿Cómo se accede a una propiedad de un bean para leer en un archivo de configuración xml de spring?
-
02-07-2019 - |
Pregunta
Quiero hacer algo como lo siguiente en primavera:
<beans>
...
<bean id="bean1" ... />
<bean id="bean2">
<property name="propName" value="bean1.foo" />
...
Pensaría que esto tendría acceso al método getFoo () de bean1 y llamaría al método setPropName () de bean2, pero esto no parece funcionar.
Solución
Lo que entendí:
- Tienes un bean (bean1) con un propiedad llamada " foo "
- Tienes otro bean (bean2) con un propiedad denominada " propName " ;, que también tiene que tener el mismo " foo " que en bean1.
por qué no hacer esto:
<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>
Al hacer esto, su bean2 no está acoplado a bean1 como en su ejemplo. Puede cambiar bean1 y bean2 sin afectarse entre sí.
Si REALMENTE necesita hacer la inyección que propuso, puede usar:
<util:property-path id="propName" path="bean1.foo"/>
Otros consejos
Debe usar 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>
Creo que tienes que inyectar bean1, y luego obtener foo
manualmente debido a un problema de tiempo. ¿Cuándo resuelve el marco el valor del bean objetivo?
Puedes crear un bean de puntero y configurarlo.
class SpringRef {
private String targetProperty;
private Object targetBean;
//getters/setters
public Object getValue() {
//resolve the value of the targetProperty on targetBean.
}
}
Common-BeanUtils debería ser útil.