Como você acessar uma propriedade de um feijão para leitura em um arquivo de configuração XML do Spring?

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

  •  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.

Foi útil?

Solução

O que eu entendi:

  1. Você tem um feijão (bean1) com um propriedade chamada "foo"
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top