2009-07-10 19 views
9

Tengo un FileSystemXmlApplicationContext y me gustaría que los beans definidos en el XML tomar como argumento del constructor un grano que no se declara en la primavera¿Cómo puedo inyectar un bean en un ApplicationContext antes de que se cargue desde un archivo?

Por ejemplo, me gustaría hacer:

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

por lo que podría imaginar hacer esto a través de algo como:?

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

Excepto que no hay tal método :-(¿alguien sabe cómo puedo lograr esto

Respuesta

15

¿Qué hay de programáticamente la creación de un contexto padre vacío primero, registrando su objeto como un singleton con contexto BeanFactory utilizando el hecho de que getBeanFactory devuelve una implementación de SingletonBeanRegistry.

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

continuación, especifique este contexto como un padre a su contexto "real" Los granos en el contexto niño podrán entonces para referirse al frijol en el padre.

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

voy a comprobar esto y upvote! (Solo obtener el código para compilar :-) –

+0

ApplicationContext no implementa SingletonBeanRegistry –

+0

He jugado siguiendo su sugerencia sin suerte. ¡Más ayuda bienvenida! –

1

Como he tenido problemas para resolver esto con un AnnotationConfigApplicationContext, me encontré con la siguiente alternativa:

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