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

Ita*_*man 16 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); 
}
Run Code Online (Sandbox Code Playgroud)

BeanDefinition API让我指定新bean的类,因此它不适合我,因为我想指定实例.我设法找到了一个解决方案,但它花了两个额外的工厂bean,这似乎是太多代码用于这样一个目的.

是否有满足我需求的标准API?

小智 17

你可以使用这个上下文:

GenericApplicationContext mockContext = new GenericApplicationContext();
Run Code Online (Sandbox Code Playgroud)

有一个

mockContext.getBeanFactory().registerSingleton("name", reference);
Run Code Online (Sandbox Code Playgroud)

并将其插入真实环境中

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
            new String[] { "real-context.xml" }, mockContext);
Run Code Online (Sandbox Code Playgroud)

这些课程是:

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.context.support.GenericApplicationContext;
Run Code Online (Sandbox Code Playgroud)


ska*_*man 16

你需要跳过几个箍才能做到这一点.第一步是获取对上下文的底层BeanFactory实现的引用.这只有在您的上下文实现ConfigurableApplicationContext时才有可能,而大多数标准实现ConfigurableApplicationContext.然后,您可以将该实例注册为该Bean工厂中的单例:

ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)appContext;
SingletonBeanRegistry beanRegistry = configContext.getBeanFactory();
beanRegistry.registerSingleton("xxyy", bean);
Run Code Online (Sandbox Code Playgroud)

您可以像这样将任何对象"插入"上下文.