在我的程序中,我需要以编程方式配置ApplicationContext。具体来说,我有一个MyClass实例的引用,我想将它定义为一个名为“xxyy”的新bean。
public void f(MyClass mc, ApplicationContext ac) {
// define mc as the "xxyy" bean on ac ???
...
...
// Now retrieve that bean
MyClass bean = (MyClass) ac.getBean("xxyy");
// It should be the exact same object as mc
Assert.assertSame(mc, bean);
}
BeanDefinition API让我指定新bean的类,所以它不适合我,因为我想指定实例。 我设法找到了一个解决方案,但它花了两个额外的工厂bean,这似乎是太多代码用于这样一个目的。
是否有满足我需求的标准API?
答案 0 :(得分:17)
您可以使用此上下文:
GenericApplicationContext mockContext = new GenericApplicationContext();
有一个
mockContext.getBeanFactory().registerSingleton("name", reference);
并将其插入真实环境
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "real-context.xml" }, mockContext);
,课程是:
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
答案 1 :(得分:16)
你需要跳过几个箍才能做到这一点。第一步是获取对上下文的底层BeanFactory实现的引用。这只有在您的上下文实现ConfigurableApplicationContext时才有可能,而大多数标准实现ConfigurableApplicationContext。然后,您可以将该实例注册为该Bean工厂中的单例:
ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)appContext;
SingletonBeanRegistry beanRegistry = configContext.getBeanFactory();
beanRegistry.registerSingleton("xxyy", bean);
您可以将任何对象“插入”上下文。