2009-07-10 10 views
9

Ich habe ein FileSystemXmlApplicationContext und ich würde die Bohnen in der XML definiert wie als Konstruktorargument eine Bohne zu ergreifen, die im Frühjahr nicht erklärt wirdWie kann ich eine Bean in einen ApplicationContext injizieren, bevor sie aus einer Datei geladen wird?

Zum Beispiel würde ich gerne tun:

<bean class="some.MyClass"> 
    <constructor-arg ref="myBean" /> 
</bean> 

so konnte ich wie tun dies über etwas vorstellen:

Object myBean = ... 
context = new FileSystemXmlApplicationContext(xmlFile); 
context.addBean("myBean", myBean); //add myBean before processing 
context.refresh(); 

Abgesehen davon, dass es keine solche Methode :-(Wer weiß, wie ich das erreichen kann

Antwort

15

Wie programmatisch wird zuerst ein leerer übergeordneter Kontext erstellt, indem Ihr Objekt als Singleton mit BeanFactory des Kontexts unter Verwendung der Tatsache registriert wird, dass getBeanFactory eine Implementierung von SingletonBeanRegistry zurückgibt.

parentContext = new ClassPathXmlApplicationContext(); 
parentContext.refresh(); //THIS IS REQUIRED 
parentContext.getBeanFactory().registerSingleton("myBean", myBean) 

Dann geben Sie diesen Kontext als Eltern zu Ihrem „echten“ Kontext Die Bohnen in dem Kind Kontext werden dann in der Lage sein, um die Bohne in der Mutter zu verweisen.

String[] fs = new String[] { "/path/to/myfile.xml" } 
appContext = new FileSystemXmlApplicationContext(fs, parentContext); 
+0

ich das überprüfen wird und upvote Sie! (Nur Code zum kompilieren bekommen :-) –

+0

ApplicationContext implementiert SingletonBeanRegistry nicht –

+0

Ich habe herum gespielt, Ihrem Vorschlag ohne Glück folgend. Mehr Hilfe willkommen! –

1

Als ich Probleme lösen dies mit einem AnnotationConfigApplicationContext hatte, fand ich die folgende Alternative:

DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); 
beanFactory.registerSingleton("customBean", new CustomBean()); 
context = new AnnotationConfigApplicationContext(beanFactory); 
context.register(ContextConfiguration.class); 
context.refresh(); 
Verwandte Themen