其他分享
首页 > 其他分享> > Spring:将ApplicationContext的对象注入ApplicationContext

Spring:将ApplicationContext的对象注入ApplicationContext

作者:互联网

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

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

我想从LegacyPlugin启动一个ApplicationContext,并通过BeanFactory将其注入ApplicationContext,以创建其他对象.然后将重写代码,以使用setter injection&等等.

我想知道实现这一目标的最佳方法是什么.到目前为止,我有一个使用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接口允许您通过其registerSingleton方法手动将预配置的单例注入上下文,如下所示:

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

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

ctx.refresh();

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

标签:dependency-injection,spring,legacy-code
来源: https://codeday.me/bug/20190626/1296670.html