0

我有一个应该以两种不同方式注入的类:

  1. 通用作为单例

  2. 自定义版本为 RequestScoped。

例子:

public class TaskProcessorService implements TaskProcessor {
    private final TaskRegistry taskRegistry;
    @Inject
    public TaskProcessorService(TaskRegistry taskRegistry){
        this(taskRegistry, null);
    }
    @AssistedInject
    public TaskProcessorService(TaskRegistry taskRegistry, @Assisted String userId) {...}

    public synchronized void performTask(){...}
}

假设每个人都可以使用通用对象并竞争 performTask 操作(因为它是同步的),或者他们可以投资并创建自己的实例/实例。

出于一般目的,我创建了界面

public interface TaskProcessor{
     void performTask();
}

和绑定:

bind(TaskProcessor.class).to(TaskProcessorService .class).in(Singleton.class);

对于定制版本,我创建了工厂

public interface TaskProcessorFactory{
    public TaskProcessor(@Assisted String userId);
}

并安装它:

install(new FactoryModuleBuilder()
 .implement(TaskProcessorService.class, TaskProcessorService.class)
 .build(TaskProcessorFactory.class));

我已经尝试过了,它在运行时工作(我希望我没有在手动编写上面的代码时出错),但是我不确定它是否完全按照我的意愿工作,因为我只是写了它并且没有时间对其进行全面测试。

但后来我意识到我不知道工厂是如何运作的。对于不同的用户('userId'),它应该创建不同的实例,但是相同的 userId 呢?假设某个 John Doe 想要创建 3 个 TaskProcessorService 实例,工厂是否会为每个调用创建 3 个不同的实例(假设参数相同 - john doe 的 ID)?

这是主要问题,即使对于具有相同参数的调用,工厂是否总是创建新对象?在文档中找不到任何关于它的证据,而且我不能 100% 确定是否没有创建某些缓存机制。

第二个问题,它是问题的最佳解决方案吗?

4

1 回答 1

0

你的第一个问题的答案是肯定的。在您的情况下,它将始终创建不同的对象。对于第二个问题继续阅读。

有 2 个绑定引用同一个接口是不正确的。@AssistedInject如果一个对象有 2 个构造函数,您在工厂中使用和注释它们,您需要 2 个反映这些构造函数的方法。然后只需使用FactoryModuleBuilder.

于 2017-03-02T19:44:23.503 回答