Como você acessar uma propriedade de um feijão para leitura em um arquivo de configuração XML do Spring?
-
02-07-2019 - |
Pergunta
Eu quero fazer algo como o seguinte na primavera:
<beans>
...
<bean id="bean1" ... />
<bean id="bean2">
<property name="propName" value="bean1.foo" />
...
Gostaria de pensar que isso iria acessar o método getFoo () de bean1 e chamar o método setPropName () de bean2, mas isso não parece trabalho.
Solução
O que eu entendi:
- Você tem um feijão (bean1) com um propriedade chamada "foo"
- Você tem uma outra feijão (bean2) com um propriedade chamada "propName", wich também tem que ter o mesmo "foo" que, em bean1.
Por que não fazer isso:
<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>
Fazendo isso, seu bean2 não é acoplado a bean1 como no seu exemplo. Você pode alterar bean1 e bean2 sem afetar o outro.
Se você realmente necessidade de fazer a injeção você propôs, você pode usar:
<util:property-path id="propName" path="bean1.foo"/>
Outras dicas
Você precisa 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>
Eu acho que você tem que bean1 injetar, então, fazer foo
manualmente por causa de um problema de tempo. Quando é que a decisão-quadro, o valor do feijão-alvo?
Você pode criar um feijão ponteiro e configure isso.
class SpringRef {
private String targetProperty;
private Object targetBean;
//getters/setters
public Object getValue() {
//resolve the value of the targetProperty on targetBean.
}
}
Common-BeanUtils deve ser útil.