Возможно ли из Spring ввести результат вызова метода на ref bean?
Можно ли из Spring ввести результат вызова метода в ref bean?
Я пытаюсь реорганизовать некоторый вырезанный/вставленный код из двух отдельных проектов в общий класс. В одном из проектов код живет в классе, который я буду называть "MyClient", который создается из Spring. Он вводится другим spring -инстантированным классом "MyRegistry", тогда класс MyClient использует этот класс для поиска конечной точки. Все, что мне действительно нужно, это конечная строка String в моем рефакторированном классе, который может быть инициализирован с помощью Setter. У меня действительно не может быть зависимости от MyRegistry от MyClient в обновленном коде.
Итак, мой вопрос в том, что... есть способ, которым я могу вставить конец строки из Spring, который был просмотрен в классе MyRegistry. Итак, у меня есть:
<bean id="registryService" class="foo.MyRegistry">
...properties set etc...
</bean>
<bean id="MyClient" class="foo.MyClient">
<property name="registry" ref="registryService"/>
</bean>
Но я бы хотел (и я знаю, что это мнимый синтаксис Spring)
<bean id="MyClient" class="foo.MyClient">
<property name="endPoint" value="registryService.getEndPoint('bar')"/>
</bean>
где MyRegistry будет иметь метод getEndPoint (Stringng endPointName)
Надеюсь, что это имеет смысл с точки зрения того, чего я пытаюсь достичь. Пожалуйста, дайте мне знать, если что-то подобное возможно в Spring!
Ответы
Ответ 1
Самое приятное решение - использовать язык выражения Spring 3, как описано в @ChssPly76, но если вы используете более старую версию Spring, это почти так же просто:
<bean id="MyClient" class="foo.MyClient">
<property name="endPoint">
<bean factory-bean="registryService" factory-method="getEndPoint">
<constructor-arg value="bar"/>
</bean>
</property>
</bean>
Ответ 2
Это возможно в Spring 3.0 через 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>
Ответ 3
Или в Spring 2.x, используя BeanPostProcessor
Как правило, пост-процессоры bean используются для проверки достоверности свойств bean или изменения bean свойств (что вы хотите) в соответствии с конкретными критериями.
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;
}
}
И зарегистрируйте свой BeanPostProcessor
<bean class="br.com.somthing.MyClientBeanPostProcessor"/>