首页 > 解决方案 > 以编程方式生成多个 bean

问题描述

我有多个商家,每个商家都需要具有不同配置的 WSDL。现在,我正在复制并粘贴以下方法并更改配置。但这会产生一些困难(需要更改代码和部署)。我想在运行时以编程方式对其进行初始化。我已经尝试过这些方法,但它不起作用。可能吗?

@Bean(name = "marchant-1")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema commonSchema) {
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("Marchant1WSPort");
        wsdl11Definition.setLocationUri("/Marchant1WebService");
        wsdl11Definition.setTargetNamespace("http://.../");
        wsdl11Definition.setSchema(commonSchema);
        return wsdl11Definition;
}

标签: springspring-bean

解决方案


我通过将 bean 的范围指定为prototype. 下面的例子解释了我的实现:

创建你的DefaultWsdl11Definition类,如下所示:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype")
@Getter
@Setter
public class DefaultWsdl11Definition {
    private String portTypeName;
    private String locationUri;
    private String targetNamespace;
    private XsdSchema schema;
}

实现以编程ApplicationContextAware方式生成:beans

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;

@Service
public class ApplicationContextAwareImpl implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        ApplicationContextAwareImpl.initApplicationContext(applicationContext);
    }

    private static void initApplicationContext(ApplicationContext applicationContext) {
        ApplicationContextAwareImpl.context = applicationContext;
    }

    /**
     * @param requiredType Bean class
     *
     * @return Bean of required type
     */
    public static <T> T getBean(Class<T> requiredType) {
        return context.getBean(requiredType);
    }
}

使用ApplicationContextAwareImpl.getBean()方法以编程方式生成 bean:

DefaultWsdl11Definition wsdl11Definition = ApplicationContextAwareImpl.getBean(DefaultWsdl11Definition.class);

wsdl11Definition.setPortTypeName("Marchant1WSPort");
wsdl11Definition.setLocationUri("/Marchant1WebService");
wsdl11Definition.setTargetNamespace("http://.../");
wsdl11Definition.setSchema(commonSchema);

您还可以使用QualifierBean注释来生成多个相同类型的 bean:

@Configuration
public class BeanConfigurations {
    @Qualifier("marchant-1")
    @Bean(name = "marchant-1")
    public DefaultWsdl11Definition defaultWsdl11Definition1(XsdSchema commonSchema) {
            DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
            wsdl11Definition.setPortTypeName("Marchant1WSPort");
            wsdl11Definition.setLocationUri("/Marchant1WebService");
            wsdl11Definition.setTargetNamespace("http://.../");
            wsdl11Definition.setSchema(commonSchema);

            return wsdl11Definition;
    }

    @Qualifier("marchant-2")
    @Bean(name = "marchant-2")
    public DefaultWsdl11Definition defaultWsdl11Definition2(XsdSchema commonSchema) {
            DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
            wsdl11Definition.setPortTypeName("Marchant2WSPort");
            wsdl11Definition.setLocationUri("/Marchant2WebService");
            wsdl11Definition.setTargetNamespace("http://.../");
            wsdl11Definition.setSchema(commonSchema);

            return wsdl11Definition;
    }
}

推荐阅读