2011-06-24 19 views
2

我有Guice注入的對象有兩種生命週期方法bind()unbind()如何用Guice控制對象的生命週期

@Inject 
final void autoBind() { 
    bind(); 
} 

我想要做的就是對象的一個​​新實例之前調用舊的(當前的)對象的方法unbind():對象由吉斯使用下面標註的方法實例化後,該方法bind()被自動調用由Guice創建。我怎麼做?

在此先感謝!

回答

2

首先,我不會建議你只用註釋@任意方法注入。將其留給建設者,偶爾用於可選的注入和/或現場注入。

你想要做的事聽起來有點奇怪,我不確定這正是你想要的。你能否提供更多的背景知識,你可能會採取不同的做法。線程的安全性以及如何管理引用確實存在一些問題。

根據你所描述的,@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意義上的「綁定」。

另請注意......關於我的頭頂我非常確定提供者被視爲單身人士,因此維護這樣的狀態將起作用。如果沒有,你顯然可以用某種單體工廠創建一個間接級別(但這不是必須的)。

+0

感謝您的回答。我已經嘗試過這個解決方案,我認爲這是我需要的,但是問題出現在構造函數中的'Provider '中,導致無限循環。這是因爲Guice尋找'Foo'的'Provider',找到'FooProvider',然後遞歸地嘗試在構造函數中注入'Provider '。如果你知道如何解決這個問題,請讓我知道!否則,它會做我所需要的。謝謝! – janhink

+0

@eQui - 您是否對注入的內部提供商使用了綁定註釋?就Guice而言,'Foo'和'@Unbound Foo'是兩種完全不同的類型。看看'com.google.inject.Key'類。這是Guice在內部用於區分類型的類型。注意它是類型信息(如類)+綁定註釋信息(如@Unbound)。只要'@Unbound Foo'不直接或間接依賴'Foo',就應該沒有循環依賴。 – Tom

+0

如果您仍然遇到問題,請在評論中提問更多問題和/或發佈您的代碼(通過添加對問題的更新) – Tom

0

我想你可以有一個提供程序保持對當前對象的引用。當你打電話給提供者時,它會解除綁定最後一個對象,構建新對象並保存對它的引用。

但我真的不知道你爲什麼會想要做這樣的事情,因爲其他的對象可以在理論上仍然可以參考它