創建obejcts我應該在兩種不同的方式注入了一類:與AssistedInject廠吉斯
通用的單
定製版本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%確定是否創建了一些緩存機制。
第二個問題,它是問題的最佳解決方案?
Thx爲第一部分。 關於FactoryModuleBuilder - 我相信你不能強制第一個構造函數中的單例實例。 最後約2個綁定 - 從技術上講,你說的是真的,我的解決方案暴露他們(不直接但仍然),另一方面,你可以注入接口沒有問題,我找不到更好的解決方案。 – Rychu
是否需要從第一個構造函數提供單例?如果是的話,那麼你可以寫一個自定義的工廠,並繞過Guice AssistedBinding。 – Nektie