Java Spring:如何从单个模板定义动态创建多个bean

Java Spring:如何从单个模板定义动态创建多个bean,java,web-services,spring,Java,Web Services,Spring,我有以下用于xml中定义的远程web服务的Springbean: <bean id="authWSTemplate" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean" abstract="true"> <property name="serviceInterface" value="com.example.webservices.Authentication" />

我有以下用于xml中定义的远程web服务的Springbean:

    <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,所以我有不同的根值。对于本例,假设有两个系统具有根:和

因此,我需要两个名为“authWSdom1”和“authWSdom2”的bean

我希望在应用程序初始化块中以编程方式实现这一点,在该块中,我将检索所有已知系统实现的列表(此信息仅在运行时已知),并为每个impl创建一个bean,缓存bean名称,然后我的应用程序将在需要时从Spring容器中检索适当的bean

或者,有更好的模式吗?也许通过在bean的构造函数中提供根值


我认为我不能在Spring中拥有一个bean,因为我需要支持跨多个端点的并发访问(即多个用户同时访问domain1和domain2)。

创建实现BeanFactoryPostProcessor和初始化bean的自定义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());

}

虽然我相信Ragnor的答案适用于在spring容器中动态创建bean,但我决定使用spring定义自己的WSTemplate DTO,然后使用工厂类使用此DTO并以编程方式构建(在运行时提供根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的不同工厂。同样,如果我必须根据某些系统/环境标准在运行时选择WS实现,这将有所帮助