我想在遗留应用程序中使用 Spring。

核心部分是一个类,我们称之为 LegacyPlugin,它代表应用程序中的一种可插入部分。问题是这个类也是数据库连接器,用于创建许多其他对象,通常通过构造函数注入(inject)......

我想从 LegacyPlugin 启动一个 ApplicationContext,然后通过 BeanFactory 将它注入(inject)到 ApplicationContext 中,以创建其他对象。然后将重写代码,以使用 setter 注入(inject)等。

我想知道实现这一目标的最佳方法是什么。到目前为止,我有一个使用 BeanFactory 的工作版本,它使用 ThreadLocal 来保存对当前执行的插件的静态引用,但对我来说似乎很难看......

下面是我想要结束的代码:

public class MyPlugin extends LegacyPlugin {

    public void execute() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext();
        // Do something here with this, but what ?
        ctx.setConfigLocation("context.xml");
        ctx.refresh();
    }

 }
<!-- This should return the object that launched the context -->
<bean id="plugin" class="my.package.LegacyPluginFactoryBean" />

<bean id="someBean" class="my.package.SomeClass">
    <constructor-arg><ref bean="plugin"/></constructor-arg>
</bean>

<bean id="someOtherBean" class="my.package.SomeOtherClass">
    <constructor-arg><ref bean="plugin"/></constructor-arg>
</bean>

最佳答案

SingletonBeanRegistry 接口(interface)允许您通过其 registerSingleton 方法手动将预配置的单例注入(inject)上下文,如下所示:

ApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.setConfigLocation("context.xml");

SingletonBeanRegistry beanRegistry = ctx.getBeanFactory();
beanRegistry.registerSingleton("plugin", this);

ctx.refresh();

这会将 plugin bean 添加到上下文中。您不需要在 context.xml 文件中声明它。

关于 Spring : Injecting the object that launches the ApplicationContext into the ApplicationContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5478116/

10-15 17:11