使用Guice的AssistedInject工厂创建对象



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

  1. 作为Singleton的通用目的

  2. 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

相关内容

  • 没有找到相关文章

最新更新