Spring Wire一个静态类

dig*_*nie 8 java 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要在启动时连接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"/>
Run Code Online (Sandbox Code Playgroud)

编辑:我不得不重新修改我的例子,因为我在自己的头脑中有点困惑...

ska*_*man 10

使用像这样的静态实际上违背了Spring IoC,但是如果你真的必须使用它们,那么我建议你写一个简单的Spring钩子,它接受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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的XML中:

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

<bean class="FooFactoryProcessor">
   <property name="foo" ref="foo"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

无需修改FooFooFactory

  • 你为什么不让spring直接管理FooFactory.你真的不需要抽象是"FooFactoryProcessor".您可以向FooFactory添加非静态属性设置器以在其上设置foo. (2认同)