我想在遗留应用程序中使用 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/