【问题标题】:Programmatically set a specific bean object - Spring DI以编程方式设置特定的 bean 对象 - Spring DI
【发布时间】:2010-11-08 17:02:45
【问题描述】:

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

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

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

    ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)appContext;
    SingletonBeanRegistry beanRegistry = configContext.getBeanFactory();
    beanRegistry.registerSingleton("xxyy", bean);
    

    您可以像这样将任何对象“插入”到上下文中。

    【讨论】:

    • 这救了我的命!
    【解决方案2】:

    你可以使用这个上下文:

    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;
    

    【讨论】:

    • 我无法把它变成麦汁:(我的 ctx 只是得到子 bean 而不是父 bean...
    猜你喜欢
    • 1970-01-01
    • 2013-08-31
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多