我有一个应该以两种不同方式注入的课程:
一般用作单身人士
自定义版本为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%确定是否没有创建一些缓存机制。
第二个问题,是问题的最佳解决方案吗?
答案 0 :(得分:0)
回答你的第一个问题是肯定的。在您的情况下,它将始终创建不同的对象。第二个问题继续阅读。
有2个绑定指向同一个接口是不正确的。如果对象具有2个构造函数,则使用@AssistedInject
对它们进行注释,并且在工厂中,需要2个方法来反映这些构造函数。然后使用FactoryModuleBuilder
安装它。