我有一个应该以两种不同方式注入的类:
-
作为Singleton的通用目的
-
asurepsscoped的自定义版本。
示例:
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(){...}
}
假设每个人都可以使用通用对象并竞争性能操作(因为它已同步),或者他们可以投资并创建其自己的实例/实例。
对于通用目的,我创建了界面
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));
我已经尝试过它,并且在运行时起作用(我希望我没有犯错误编写代码的错误),霍夫维尔我不确定它是否完全按照我的意愿工作
有时间进行全面测试。,但后来我意识到我不知道工厂的工作原理。对于不同的用户("用户ID"),它应该创建不同的实例,但是同一用户呢?假设有些约翰·杜(John Doe)想创建3个taskProcessorService的实例,工厂会为每个呼叫创建3个不同的实例(假设参数相同 - John Doe的ID)?
这是主要问题,工厂是否总是为具有相同参数的调用创建新对象吗?在文档中找不到任何有关它的证据,我不能100%确定是否没有创建某些缓存机制。
和第二期,这是问题的最佳解决方案吗?
回答您的第一个问题是肯定的。在您的情况下,它将始终创建不同的对象。对于第二个问题,继续阅读。
具有2个绑定涉及相同接口是不正确的。如果一个具有2个构造函数的对象,则用@AssistedInject
和在工厂中对它们进行注释,您需要2种反映这些构造函数的方法。然后只需使用FactoryModuleBuilder
。