繁体   English   中英

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

[英]Is it possible from Spring to inject the result of calling a method on a ref bean?

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

希望从我想要实现的目标出发是有道理的。 如果春天有这样的事情,请告诉我!

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

最好的解决方案是使用@ 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>

或者在Spring 2.x中,使用BeanPostProcessor

通常,bean post处理器用于根据特定条件检查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"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM