Возможно ли из Spring ввести результат вызова метода на ref bean?
можно ли из Spring ввести результат вызова метода на ref bean?
Я пытаюсь рефакторинг некоторые вырезать/вставить код из двух отдельных проектов в единый класс. В одном из проектов код живет в классе, который я назову "MyClient", который создается с весны. Он вводится с другим классом spring-instantiated "MyRegistry", затем класс MyClient использует этот класс для поиска конечной точки. Все, что мне действительно нужно, это строка конечной точки в моем рефакторинг класса, который может быть инициализирован через сеттер. Я действительно не имеют зависимость от 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>
но я хотел бы иметь (и я знаю, что это воображаемый синтаксис весны)
<bean id="MyClient" class="foo.MyClient">
<property name="endPoint" value="registryService.getEndPoint('bar')"/>
</bean>
где MyRegistry будет иметь метод getEndPoint(Stirng endPointName)
надеюсь, что имеет смысл с точки зрения того, что я пытаюсь добиться. Пожалуйста, дайте мне знать, если что-то подобное можно весной!
3 ответа:
самое приятное решение-использовать язык выражений 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>
это возможно весной 3.0 через Язык Весеннего Выражения:
<bean id="registryService" class="foo.MyRegistry"> ...properties set etc... </bean> <bean id="MyClient" class="foo.MyClient"> <property name="endPoint" value="#{registryService.getEndPoint('bar')}"/> </bean>
или весной 2.x, используя BeanPostProcessor
обычно постпроцессоры 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"/>