我有Guice注入的對象有兩種生命週期方法bind()
和unbind()
。如何用Guice控制對象的生命週期
@Inject
final void autoBind() {
bind();
}
我想要做的就是對象的一個新實例之前調用舊的(當前的)對象的方法unbind()
:對象由吉斯使用下面標註的方法實例化後,該方法bind()
被自動調用由Guice創建。我怎麼做?
在此先感謝!
我有Guice注入的對象有兩種生命週期方法bind()
和unbind()
。如何用Guice控制對象的生命週期
@Inject
final void autoBind() {
bind();
}
我想要做的就是對象的一個新實例之前調用舊的(當前的)對象的方法unbind()
:對象由吉斯使用下面標註的方法實例化後,該方法bind()
被自動調用由Guice創建。我怎麼做?
在此先感謝!
首先,我不會建議你只用註釋@任意方法注入。將其留給建設者,偶爾用於可選的注入和/或現場注入。
你想要做的事聽起來有點奇怪,我不確定這正是你想要的。你能否提供更多的背景知識,你可能會採取不同的做法。線程的安全性以及如何管理引用確實存在一些問題。
根據你所描述的,@meverett提到的方法可能會起作用。如果您擁有的物品是Foo
s,它會看起來像這樣。
// Later on be sure to bind(Foo.class).toProvider(FooProvider.class);
final class FooProvider implements Provider<Foo> {
private final Provider<Foo> unboundFooProvider;
private Foo currentInstance;
@Inject FooProvider(@Unbound Provider<Foo> unboundFooProvider) {
this.unboundFooProvider = unboundFooProvider;
}
@Override public Foo get() {
if (currentInstance != null) {
currentInstance.unbind();
}
currentInstance = unboundFooProvider.get();
currentInstance.bind();
return currentInstance;
}
}
請注意,您@Unbound Foo
提供商將產生Foo
•不用調用任何特殊的方法。常規的FooProvider
跟蹤狀態並決定何時對bind()
和unbind()
這些實例。請注意如何管理多個實例並將它們與多個線程一起使用。
此外,只是要清楚:我使用@Unbound
,因爲您要調用的方法被稱爲bind()
和unbind()
。我沒有使用Guice意義上的「綁定」。
另請注意......關於我的頭頂我非常確定提供者被視爲單身人士,因此維護這樣的狀態將起作用。如果沒有,你顯然可以用某種單體工廠創建一個間接級別(但這不是必須的)。
我想你可以有一個提供程序保持對當前對象的引用。當你打電話給提供者時,它會解除綁定最後一個對象,構建新對象並保存對它的引用。
但我真的不知道你爲什麼會想要做這樣的事情,因爲其他的對象可以在理論上仍然可以參考它
上一頁反應解決其他問題很好,所以剛纔回答這個問題:
Netflix公司在2012年推出governator in github爲 「enhance Google Guice to provide ... lifecycle management」。它提供註釋(@PreConfiguration
,@PostConstruct
,@PreDestroy
等),類路徑掃描&自動綁定和其他功能。 Bootstrapping是直截了當的。
感謝您的回答。我已經嘗試過這個解決方案,我認爲這是我需要的,但是問題出現在構造函數中的'Provider'中,導致無限循環。這是因爲Guice尋找'Foo'的'Provider',找到'FooProvider',然後遞歸地嘗試在構造函數中注入'Provider '。如果你知道如何解決這個問題,請讓我知道!否則,它會做我所需要的。謝謝! –
janhink
@eQui - 您是否對注入的內部提供商使用了綁定註釋?就Guice而言,'Foo'和'@Unbound Foo'是兩種完全不同的類型。看看'com.google.inject.Key'類。這是Guice在內部用於區分類型的類型。注意它是類型信息(如類)+綁定註釋信息(如@Unbound)。只要'@Unbound Foo'不直接或間接依賴'Foo',就應該沒有循環依賴。 –
Tom
如果您仍然遇到問題,請在評論中提問更多問題和/或發佈您的代碼(通過添加對問題的更新) – Tom