72 votes

Est-il possible à partir de Spring d'injecter le résultat de l'appel d'une méthode sur un ref bean ?

Est-il possible à partir de Spring d'injecter le résultat de l'appel d'une méthode sur un ref bean ?

J'essaie de refondre du code coupé/collé de deux projets distincts dans une classe commune. Dans l'un des projets, le code se trouve dans une classe que j'appellerai "MyClient" qui est instanciée à partir de Spring. Elle est injectée avec une autre classe Spring "MyRegistry", puis la classe MyClient utilise cette classe pour rechercher un point de terminaison. Tout ce dont j'ai besoin, c'est de la chaîne de caractères du point d'accès dans ma classe refactorisée, qui peut être initialisée par le biais d'une chaîne de caractères (Setter). Je ne peux vraiment pas avoir une dépendance sur MyRegistry à partir de MyClient dans le code remanié.

Ma question est donc la suivante : existe-t-il un moyen d'injecter la chaîne de point de terminaison de Spring qui a été recherchée dans la classe MyRegistry. Donc, j'ai actuellement :

<bean id="registryService" class="foo.MyRegistry">
...properties set etc...
</bean>

<bean id="MyClient" class="foo.MyClient">
    <property name="registry" ref="registryService"/>
</bean>

Mais j'aimerais avoir (et je sais que c'est une syntaxe imaginaire de Spring)

<bean id="MyClient" class="foo.MyClient">
    <property name="endPoint" value="registryService.getEndPoint('bar')"/>
</bean>

où MyRegistry aura une méthode getEndPoint(Stirng endPointName)

J'espère que cela a du sens du point de vue de ce que j'essaie de réaliser. N'hésitez pas à me faire savoir si quelque chose comme cela est possible au printemps !

114voto

ChssPly76 Points 53452

C'est possible dans Spring 3.0 via Langage d'expression Spring :

<bean id="registryService" class="foo.MyRegistry">
...properties set etc...
</bean>

<bean id="MyClient" class="foo.MyClient">
  <property name="endPoint" value="#{registryService.getEndPoint('bar')}"/>
</bean>

49voto

skaffman Points 197885

La solution la plus simple est d'utiliser le langage d'expression de Spring 3 comme décrit par @ChssPly76, mais si vous utilisez une version plus ancienne de Spring, c'est presque aussi simple :

<bean id="MyClient" class="foo.MyClient">
   <property name="endPoint">
      <bean factory-bean="registryService" factory-method="getEndPoint">
         <constructor-arg value="bar"/>
      </bean>
   </property>
</bean>

3voto

Arthur Ronald Points 19001

Ou dans Spring 2.x, en utilisant un BeanPostProcessor

En général, les post-processeurs de haricots sont utilisés pour vérifier la validité des propriétés des haricots. ou modifier les propriétés des haricots (ce que vous voulez) selon des critères particuliers.

public class MyClientBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {

    private ApplicationContext applicationContext;
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if((bean instanceof MyClient)) && (beanName.equals("MyClient"))) {
            Myregistry registryService = (Myregistry) applicationContext.getBean("registryService");

           ((MyClient) bean).setEndPoint(registryService.getEndPoint("bar"));
        }

        return bean;
    }
}

Et enregistrez votre BeanPostProcessor

<bean class="br.com.somthing.MyClientBeanPostProcessor"/>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X