2009-07-28 80 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无法在应用程序上下文完成加载之前运行。