以编程方式设置特定的bean对象 - Spring DI

时间:2009-07-07 13:43:34

标签: java spring dependency-injection

在我的程序中,我需要以编程方式配置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?

2 个答案:

答案 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);

您可以将任何对象“插入”上下文。