从Spring可以注入对ref bean调用方法的结果吗?


73

从Spring可以注入对ref bean调用方法的结果吗?

我试图将来自两个单独项目的一些剪切/粘贴的代码重构为一个公共类。在其中一个项目中,代码位于一个我称为“ MyClient”的类中,该类是从Spring实例化的。它被注入另一个弹簧实例化的类“ MyRegistry”,然后MyClient类使用该类来查找端点。我真正需要的只是重构类中的终结点String,可以通过Setter对其进行初始化。我真的不能在重构代码中从MyClient依赖MyRegistry。

所以,我的问题是……有没有办法从MyRegistry类中查找的spring注入端点String。因此,我目前有:

<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)

从我要实现的目标的角度来看,这是有意义的。请让我知道春季是否可能发生这种情况!

Answers:


50

最好的解决方案是使用@ ChssPly76描述的Spring 3的表达语言,但是如果使用的是Spring的旧版本,则几乎一样容易:

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

1
非常酷-有点弯曲。我们在这里使用Spring 2.5.6,因此我将尝试使用此技术。我知道您现在在做什么...您将getEndPoint()方法作为RegistryService上的工厂方法处理-“工厂构造”类是表示endPoint的简单String。很酷!我希望这行得通!
亚历克斯·沃登

4
“狡猾”的确,你怎么敢:)这是究竟如何factory-bean,并factory-method应该被使用,我会让你知道:)
skaffman

117

在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>

1
@ ChssPly76欢迎您,您回来了
Arthur Ronald

该死的,这派上用场
Pieter De Bie 2015年

1
如果getEndPoint()逻辑对其内部没有在运行时设置的逻辑具有依赖性,那么该方法会起作用吗?例如,也许“ endPoint”是其中foo.MyRegistry尚未设置值的变量,所以在运行时它为null,而试图设置endPointin MyClientbean会很困惑吗?
beckah 2015年

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"/>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.