从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)
希望从我正在努力实现的目标出发,这是有道理的。如果春天有这样的事情,请告诉我。
答案 0 :(得分:106)
可以在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 :(得分:46)
最好的解决方案是使用@ 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>
答案 2 :(得分:2)
或者在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"/>