introduccion - spring mvc arquitectura java
¿Es posible desde Spring inyectar el resultado de llamar a un método en un ref bean? (3)
¿Es posible desde Spring inyectar el resultado de llamar a un método en un ref bean?
Estoy tratando de refactorizar un código cortado / pegado de dos proyectos separados en una clase común. En uno de los proyectos, el código vive en una clase a la que llamaré "MyClient" que está siendo instanciada desde Spring. Se inyecta con otra clase de instancia de primavera "MyRegistry", luego la clase MyClient usa esa clase para buscar un punto final. Todo lo que realmente necesito es la cadena de punto final en mi clase refactorizada, que se puede inicializar a través de un Setter. Realmente no puedo tener una dependencia en MyRegistry de MyClient en el código modificado.
Entonces, mi pregunta es esta ... ¿hay alguna manera de que pueda inyectar la cadena de punto final de la primavera que se buscó en la clase MyRegistry? Entonces, actualmente tengo:
<bean id="registryService" class="foo.MyRegistry">
...properties set etc...
</bean>
<bean id="MyClient" class="foo.MyClient">
<property name="registry" ref="registryService"/>
</bean>
Pero me gustaría tener (y sé que esto es una sintaxis imaginaria de Spring)
<bean id="MyClient" class="foo.MyClient">
<property name="endPoint" value="registryService.getEndPoint(''bar'')"/>
</bean>
donde MyRegistry tendrá un método getEndPoint (Stirng endPointName)
Espero que tenga sentido desde el punto de vista de lo que estoy tratando de lograr. ¡Por favor avíseme si algo como esto es posible en Spring!
Es posible en Spring 3.0 a través de Spring Expression Language :
<bean id="registryService" class="foo.MyRegistry">
...properties set etc...
</bean>
<bean id="MyClient" class="foo.MyClient">
<property name="endPoint" value="#{registryService.getEndPoint(''bar'')}"/>
</bean>
La mejor solución es usar el lenguaje de expresiones de Spring 3 como se describe en @ ChssPly76, pero si está usando una versión anterior de Spring, es casi igual de fácil:
<bean id="MyClient" class="foo.MyClient">
<property name="endPoint">
<bean factory-bean="registryService" factory-method="getEndPoint">
<constructor-arg value="bar"/>
</bean>
</property>
</bean>
O en Spring 2.x, utilizando un BeanPostProcessor
Por lo general, los postprocesadores de frijol se utilizan para verificar la validez de las propiedades de los frijoles o alterar las propiedades de los frijoles (lo que desee) de acuerdo con criterios particulares.
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;
}
}
Y registre su BeanPostProcessor
<bean class="br.com.somthing.MyClientBeanPostProcessor"/>