是否有可能从Spring注入在ref bean上调用方法的结果?
是否有可能从Spring注入在ref bean上调用方法的结果?
我试图将两个独立项目的一些剪切/粘贴代码重构成一个普通的类。 在其中一个项目中,代码位于一个我将称之为“MyClient”的类中,该类将从Spring实例化。 它被注入了另一个spring-instantiated类“MyRegistry”,然后MyClient类使用该类来查找一个端点。 我真正需要的是重构类中的端点string,它可以通过Setter进行初始化。 我真的不能在重构的代码中依赖MyClient MyClient。
所以,我的问题是这样的…有没有一种方法可以注入在MyRegistry类中查找弹簧端点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是可能的!
最好的解决scheme是使用@ChssPly76所描述的Spring 3的expression式语言,但是如果你使用的是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 3.0可以通过Springexpression式语言来实现 :
<bean id="registryService" class="foo.MyRegistry"> ...properties set etc... </bean> <bean id="MyClient" class="foo.MyClient"> <property name="endPoint" value="#{registryService.getEndPoint('bar')}"/> </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"/>