使用Guice中的AssistedInject Factory创建对象

时间:2017-02-25 11:24:55

标签: dependency-injection guice assisted-inject

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

  1. 一般用作单身人士

  2. 自定义版本为RequestScoped。

  3. 示例:

    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%确定是否没有创建一些缓存机制。

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

1 个答案:

答案 0 :(得分:0)

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

有2个绑定指向同一个接口是不正确的。如果对象具有2个构造函数,则使用@AssistedInject对它们进行注释,并且在工厂中,需要2个方法来反映这些构造函数。然后使用FactoryModuleBuilder安装它。

相关问题