2017-02-25 97 views
0

創建obejcts我應該在兩種不同的方式注入了一類:與AssistedInject廠吉斯

  1. 通用的單

  2. 定製版本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操作(因爲它是同步的),或者他們可以投資,並創建它自己的實例/實例。

通用I已經創建界面

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)); 

我試過了它,它在運行時工作(我希望我沒有犯錯誤,手寫上面的代碼片段),hovewer我不確定它是否完全按照我想要的那樣工作,因爲我只是寫了它,沒有時間去完全測試它。

但後來我意識到我不知道工廠是如何工作的。 對於不同的用戶('userId')它應該創建不同的實例,但是相同的userId呢?假設一些John Doe想創建3個TaskProcessorService實例,工廠是否會爲每個調用創建3個不同的實例(假設參數是相同的 - john doe's ID)?

這是主要問題,即使是對於具有相同參數的調用,工廠是否總是創建新對象?在文檔中找不到任何證據,並且我不能100%確定是否創建了一些緩存機制。

第二個問題,它是問題的最佳解決方案?

回答

0

對你的第一個問題的回答是肯定的。在你的情況下,它總是會創建不同的對象。對於第二個問題繼續閱讀。

將2個綁定引用到相同的接口是不正確的。如果是具有2個構造函數的對象,則用@AssistedInject和工廠對它們進行註釋,則需要2個反映這些構造函數的方法。然後使用FactoryModuleBuilder安裝它。

+0

Thx爲第一部分。 關於FactoryModuleBuilder - 我相信你不能強制第一個構造函數中的單例實例。 最後約2個綁定 - 從技術上講,你說的是真的,我的解決方案暴露他們(不直接但仍然),另一方面,你可以注入接口沒有問題,我找不到更好的解決方案。 – Rychu

+0

是否需要從第一個構造函數提供單例?如果是的話,那麼你可以寫一個自定義的工廠,並繞過Guice AssistedBinding。 – Nektie