java Spring Wire是一个静态类
我正在处理一个遗留代码库,其中一个在spring中未连接的类需要获得一个在spring中连接的类。我希望创建一个在启动时连接的工厂类,然后调用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"/>
编辑:我不得不重新设计我的例子,因为我自己的头脑有点混乱
# 1 楼答案
在这里使用的Spring配置中将bean定义为singleton吗?然后可以使用属性或构造函数注入(我的首选是后者)将其注入
LegacyB
,然后只有一个实例可用编辑:Re。你的问题变了(!)我不知道你为什么不把Foo作为一个单身汉再次注入你的工厂。还请注意,您可以通过Spring配置使用factory-method来使用
getInstance()
方法,并通过所有类维护注入# 2 楼答案
除了斯卡夫曼的回答,你必须非常小心初始化顺序
当使用Springbeans时,只有框架会自动计算出初始化内容的正确顺序。然而,一旦你做了单例技巧,如果你不小心,这可能会打破
换句话说,确保在应用程序上下文完成加载之前不能运行LegacyA