2009-07-07 7 views
14

Nel mio programma ho bisogno di configurare un ApplicationContext al livello di programmazione. In particolare, ho un riferimento a un'istanza di MyClass e voglio definirlo come un nuovo bean chiamato "xxyy".Imposta programmaticamente un oggetto bean specifico - 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); 
} 

L'API BeanDefinition cerchiamo di me specificare la classe del nuovo bean, in modo che non funziona per me perché voglio specificare l'istanza. Sono riuscito a trovare una soluzione, ma ci sono voluti due bean di fabbrica aggiuntivi che sembrano troppi codici per uno scopo così semplice.

Esiste un'API standard che risponde alle mie esigenze?

risposta

16

è possibile utilizzare questo contesto:

GenericApplicationContext mockContext = new GenericApplicationContext(); 

che ha un

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

e collegarlo nel contesto reale

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

e le classi sono:

import org.springframework.context.support.ClassPathXmlApplicationContext; 

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

Non riesco a capire questo :(il mio ctx è solo il bean figlio invece di quello genitore ... –

12

Per eseguire questa operazione è necessario eseguire alcuni passaggi. Il primo passo è ottenere un riferimento all'implementazione di BeanFactory sottostante al contesto. Questo è possibile solo se il tuo contesto implementa ConfigurableApplicationContext, come la maggior parte di quelli standard. È quindi possibile registrare l'istanza come un Singleton in quella fabbrica di fagioli:

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

È possibile "inserire" qualsiasi oggetto nel contesto come questo.

+1

mi ha salvato la vita! – jmcg

Problemi correlati