Действительно ли возможно от Spring ввести результат обращения к методу касательно боба?

Действительно ли возможно от Spring ввести результат обращения к методу касательно боба?

Я пытаюсь осуществить рефакторинг, некоторые сокращали/вставляли код от два, разделяют проекты на общий класс. В одном из проектов код живет в классе, который я назову "MyClient", который инстанцируют от Spring. Это введено с другим инстанцированным пружиной классом "MyRegistry", затем класс MyClient использует тот класс для поиска конечной точки. Все, в чем я действительно нуждаюсь, является Строкой конечной точки в моем пересмотренном классе, который может быть инициализирован через Метод set. У меня действительно не может быть зависимости от MyRegistry от MyClient в пересмотренном коде.

Так, мой вопрос, это... - там способ, которым я могу ввести Строку конечной точки с пружины, которая искалась в классе 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 (Stirng endPointName)

Надежда, которая имеет смысл от точка зрения того, чего я пытаюсь достигнуть. Сообщите мне, возможно ли что-то вроде этого в Spring!

72
задан skaffman 26 March 2010 в 08:11
поделиться

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>
48
ответ дан 24 November 2019 в 12:36
поделиться

Это возможно в Spring 3.0 через 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>
112
ответ дан 24 November 2019 в 12:36
поделиться

Или в 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"/>
3
ответ дан 24 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: