我有以下Spring bean用于在xml中定义的远程Web服务:
<bean id="authWSTemplate" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean" abstract="true">
<property name="serviceInterface" value="com.example.webservices.Authentication" />
<property name="wsdlDocumentUrl" value="${ws.root}/authentication?wsdl" />
<property name="namespaceUri" value="http://security.webservices.example.com/" />
<property name="serviceName" value="AuthenticationWebService" />
<property name="portName" value="AuthenticationPort" />
<property name="maintainSession" value="true" />
</bean>
如何获取此bean模板并创建具体bean(即提供root属性)?我可以将具体的bean放入Spring容器吗?
我需要许多指向不同系统的具体bean,所以我有不同的根值。对于此示例,假设有两个具有根的系统:http://domain1.com:8001/ws和http://domain2.com:8002/ws。
因此我想要2个名为“authWSdom1”和“authWSdom2”的bean。
我期望在应用程序初始化块中以编程方式执行此操作,在此我将检索所有已知系统实现的列表(此信息仅在运行时已知),并为每个impl创建一个bean,缓存bean name,然后我的应用程序将在需要时从Spring容器中检索适当的bean。
或者,有更好的模式吗?也许通过在bean的构造函数中提供root值?
我想我在Spring中不能拥有一个bean,因为我需要支持跨多个端点的并发访问(即多个用户同时访问domain1和domain2)。
答案 0 :(得分:1)
创建实现BeanFactoryPostProcessor和InitializingBean的自定义bean。 使用postProcessBeanFactory方法创建bean:
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
String wsdlDocumentUrl = ....;
// .......
registry.registerBeanDefinition(YOUR_BEAN_NAME, BeanDefinitionBuilder.childBeanDefinition(
getParentNoDomainServicBeanName(authWSTemplate)).addPropertyReference(
"wsdlDocumentUrl", wsdlDocumentUrl).getBeanDefinition());
}
答案 1 :(得分:0)
虽然我相信如果你想在spring容器中动态创建bean,Ragnor的答案是合适的,我决定使用spring来定义我自己的WSTemplate DTO,然后使用工厂类来使用这个DTO并以编程方式构建(root url)在运行时提供并添加了DTO后缀值)并缓存生成的JaxWS ProxyBean:
<bean id="authWSTemplate" class="com.example.WSProxyTemplate">
<property name="serviceInterface" value="com.example.webservices.Authentication" />
<property name="wsdlDocumentUrlSuffix" value="/authentication?wsdl" />
<property name="namespaceUri" value="http://security.webservices.example.com/" />
<property name="serviceName" value="AuthenticationWebService" />
<property name="portName" value="AuthenticationPort" />
<property name="maintainSession" value="true" />
</bean>
我喜欢这种方法,因为我的spring配置是从实际使用的WS bean中抽象出来的。即如果我想使用其他JaxWS,那么我只想写一个使用相同DTO bean的不同工厂。同样,如果我必须在运行时根据某些系统/ env标准选择WS实现,这将有所帮助。