我正在构建一个基于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的方法时,只创建一个ExportListCommandbean,因为它只自动连接一次。但实际上我需要两个独立的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
这里惟一需要做的是,在您的主类中,@AutowireaFactoryBean<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。

09-25 20:27