我正在构建一个基于spring框架的库,我希望允许用户并行调用库的方法。
在我的主要I类自动连线服务课程中:
@Autowired
private ExportListCommand exportList;
这就是图书馆方法的实现:
public ResponseContainer<ExportListResponse> exportList(ExportListOptions options) {
exportList.setoAuthClient(oAuthClient);
ResponseContainer<ExportListResponse> result = exportList.executeCommand(options);
return result;
}
ExportListCommand
定义为bean:@Bean
@Scope("prototype")
public ExportListCommand exportList() {
return new ExportListCommand();
}
当我作为一个库用户在parallel spring中运行2 exportlist的方法时,只创建一个
ExportListCommand
bean,因为它只自动连接一次。但实际上我需要两个独立的bean。我还试图将ExportListCommand
更改为@Scope(value="prototype")
,但这也不能按我的需要工作:spring为每个方法调用创建@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
bean,并且由于我获得了新对象而丢失了ExportListCommand
值。我只想避免使用
oAuthClient
方法。我的选择是什么?谢谢。
最佳答案
我相信你在找一个“工厂”的东西。
从spring的角度来看,我有两种主要的考虑方法。
“java”方法:创建一个factory对象,它将返回ExportListCommand
这个工厂看起来像这样:
class ExportListCommandFactory {
ExportListCommand newInstance() {
return new ExportListCommand();
}
}
并将在您的方法中使用,如下所示:
@Autowire
private ExportListCommandFactory commandFactory;
public ResponseContainer<ExportListResponse> exportList(ExportListOptions options) {
final ExportListCommand exportList = commandFactory.newInstance();
exportList.setoAuthClient(oAuthClient);
ResponseContainer<ExportListResponse> result = exportList.executeCommand(options);
return result;
}
当然,这样做需要更改配置以包含一个
ExportListCommandFactory
而不是ExportListCommand
的bean。或者,你可以考虑…
“春天”的方式:使用
FactoryBean
这里惟一需要做的是,在您的主类中,
@Autowire
aFactoryBean<ExportListCommand>
而不是ExportListCommand
,在需要调用方法的方法中,请咨询工厂以获取实例。@Autowire
private FactoryBean<ExportListCommand> commandFactory;
public ResponseContainer<ExportListResponse> exportList(ExportListOptions options) {
final ExportListCommand exportList = commandFactory.getObject();
exportList.setoAuthClient(oAuthClient);
ResponseContainer<ExportListResponse> result = exportList.executeCommand(options);
return result;
}
您不需要更改配置,因为factorybean是一个特殊的bean,它将在每次调用
getObject()
时为实例咨询applicationcontext/beanfactory。