spring - 以编程方式生成多个 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;
}
解决方案
我通过将 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);
您还可以使用Qualifier
和Bean
注释来生成多个相同类型的 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;
}
}
推荐阅读
- python - Python脚本在打开时关闭
- arrays - BSimagepicker 仅显示分页滚动视图 Swift 中选择的最后一个图像的问题
- reactjs - react中让用户控制线突破输入
- elasticsearch-7 - ElasticSearch Python客户端:如何获取别名后面的索引名称
- vsto - 未调用 Outlook VSTO Explorer.Selection_Change
- java - 使用 VAO 渲染时,LWJGL 纹理渲染向方向移动
- python - 总结和划分时间的最佳方法
- google-cloud-platform - 使用自定义 docker 映像连接到 Google Cloud AI Platform Notebook 实例会导致“连接被拒绝”
- ssh - iTerm2:如何从远程会话触发本地命令?
- ios - iOS:如何使节点围绕 SceneKit 中的特定轴旋转