2009-07-07 14 views
14

Programımda programsal olarak bir ApplicationContext'i yapılandırmam gerekiyor. Spesifik olarak, bir MyClass örneğine bir referansım var ve bunu "xxyy" adında yeni bir fasulye olarak tanımlamak istiyorum.Programa göre belirli bir fasulyeli nesne ayarlayın - Yaylı 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); 
} 

BeanDefinition APı'NIN beni yeni fasulye sınıfını belirtmek izin, bu yüzden örneğini belirtmek istiyorum çünkü bu benim için çalışmaz. Bir çözüm bulmayı başardım, ancak bu türden bir amaç için çok fazla kod gibi görünen iki ek fabrika fasulyesi aldı.

Gereksinimlerime hitap eden standart bir API var mı?

cevap

16

: Gerçek bağlam içinde bir

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

sahiptir

GenericApplicationContext mockContext = new GenericApplicationContext(); 

ve fiş

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

ve sınıfları şunlardır:

import org.springframework.context.support.ClassPathXmlApplicationContext; 

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

Bunu wort'a alamıyorum :(ctx, sadece ana fasulye yerine çocuk fasulyesi olsun ... –

12

Bunu yapmak için birkaç kasnaktan geçmeniz gerekir. İlk adım, içeriğin temel BeanFactory uygulamasına bir referans elde etmektir. Bu, yalnızca içeriğinizin standartların çoğunun yaptığı ConfigurableApplicationContext uygulamasını uygularsa mümkündür. Daha sonra bu fasulye fabrikada bir singleton olarak örneğini kayıt olabilirsiniz: Böyle bağlamda içine herhangi bir nesne "insert" olabilir

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

.

Bu bağlamda kullanabilirsiniz
+1

bu benim hayatımı kurtardı! – jmcg

İlgili konular