我有一个应该以两种不同方式注入的类:
通用作为单例
自定义版本为 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% 确定是否没有创建某些缓存机制。
第二个问题,它是问题的最佳解决方案吗?