有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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"/>

编辑:我不得不重新设计我的例子,因为我自己的头脑有点混乱


共 (2) 个答案

  1. # 1 楼答案

    在这里使用的Spring配置中将bean定义为singleton吗?然后可以使用属性或构造函数注入(我的首选是后者)将其注入LegacyB,然后只有一个实例可用

    编辑:Re。你的问题变了(!)我不知道你为什么不把Foo作为一个单身汉再次注入你的工厂。还请注意,您可以通过Spring配置使用factory-method来使用getInstance()方法,并通过所有类维护注入

  2. # 2 楼答案

    除了斯卡夫曼的回答,你必须非常小心初始化顺序

    当使用Springbeans时,只有框架会自动计算出初始化内容的正确顺序。然而,一旦你做了单例技巧,如果你不小心,这可能会打破

    换句话说,确保在应用程序上下文完成加载之前不能运行LegacyA