2009-07-07 18 views
14

En mi programa, necesito configurar de forma programática un ApplicationContext. Específicamente, tengo una referencia a una instancia de MyClass y quiero definirla como un nuevo bean llamado "xxyy".Establecer programáticamente un objeto de bean específico - Spring DI

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); 
} 

La API BeanDefinition me permite especificar la clase del nuevo bean, por lo que no funciona para mí ya que quiero especificar la instancia. Me las arreglé para encontrar una solución, pero tomó dos granos de fábrica adicionales que parece demasiado código para un propósito tan primario.

¿Existe una API estándar que satisfaga mis necesidades?

Respuesta

16

puede utilizar este contexto:

GenericApplicationContext mockContext = new GenericApplicationContext(); 

que tiene una

mockContext.getBeanFactory().registerSingleton("name", reference); 

y conectarlo en el contexto real

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
      new String[] { "real-context.xml" }, mockContext); 

y las clases son:

import org.springframework.context.support.ClassPathXmlApplicationContext; 

import org.springframework.context.support.GenericApplicationContext; 
+0

No puedo hacer que esto prospere :(mi ctx acaba de obtener el frijol hijo en lugar de los padres ... –

12

Tienes que saltar unos aros para hacerlo. El primer paso es obtener una referencia a la implementación BeanFactory subyacente del contexto. Esto solo es posible si su contexto implementa ConfigurableApplicationContext, que es la mayoría de los estándares. A continuación, puede registrar su ejemplo como un producto único en esa fábrica de beans:

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

Puede "insertar" ningún objeto en el contexto de esta manera.

+1

¡esto me salvó la vida! – jmcg

Cuestiones relacionadas