2009-07-28 84 views
8

我正在處理一個傳統的代碼庫,其中春天沒有連接的類需要獲得一個在春天連線的類。我希望創建一個在啓動時連線的工廠類,然後我可以調用getInstance()方法來獲得一個有線的對象。什麼是最好的方式去做這件事?彈簧線一個靜態類

實施例:

public class LegacyA { 
    public void doSomething() { 
     ... 
     Foo foo = FooFactory.getInstance(); 
     ... 
    } 
} 

public class FooFactory { 
    private static Foo foo; 

    public static Foo getInstance() { 
     if (foo == null) throw new IllegalStateException(); 
     return foo; 
    } 
} 

我需要FooFactory在啓動時進行接線,以便LegacyA可以簡單地調用的getInstance(),以便它返回的Foo的一個實例(其也是在應用上下文定義的bean )。

<bean id="legacyA" class="LegacyA"/> 

<bean id="foo" class="Foo"/> 

<!-- I need this bean to be injected with foo so that the FooFactory can return a foo --> 
<bean id="fooFactory" class="FooFactory"/> 

編輯:我不得不重新工作,我的例子有點像我得到了一點在我自己的頭上confuzzled ...

+0

FooFooctory中如何注入Foo?一個二傳手,構造函數,...? – wds 2009-07-28 11:57:22

回答

10

使用靜這樣真的違背的Spring IoC的糧食,但如果你真的使用它們,那麼我建議寫一個簡單的彈簧鉤它接受Foo並將其注入到FooFactory,例如

public class FooFactoryProcessor implements InitializingBean { 

    private Foo foo; 

    public void setFoo(Foo foo) { 
     this.foo = foo; 
    } 

    public void afterPropertiesSet() throws Exception { 
     Foofactory.setFoo(foo); 
    } 
} 

而在你的XML:

<bean id="foo" class="Foo"/> 

<bean class="FooFactoryProcessor"> 
    <property name="foo" ref="foo"/> 
</bean> 

無需修改FooFooFactory

1

是定義在使用Spring配置的bean作爲singleton這裏 ?然後,您可以使用property或constructor inject將它注入LegacyB(我的偏好是後者),然後只有一個實例可用。

編輯:再。你改變了的問題(!)我不知道爲什麼你不把Foo作爲單例再次注入你的工廠。另請注意,您可以通過使用factory-method的Spring配置使用getInstance()方法,並通過所有類保持注入。

+0

對不起,你必須稍微改變一下問題。直到晚一點的時候,我才意識到我頭腦中的問題都是錯的。 – digiarnie 2009-07-28 09:26:25

+0

謝謝你的擡頭。這不是問題。答案適當修改。 – 2009-07-28 09:39:48

1

除了skaffman的答案,你必須非常非常小心初始化順序。

當使用Spring bean時,只有框架會自動找出初始化東西的正確順序。但是,一旦你做了單身伎倆,如果你不小心這可能會中斷。

換句話說,確保LegacyA無法在應用程序上下文完成加載之前運行。