2011-05-18 23 views
10

Estoy lidiando con una aplicación web Spring MVC que se inicia usando un DispatcherServlet. Se crea una XmlWebApplicationContext que gestiona toda la aplicación:Jerarquía de contexto de primavera con contexto de aplicación web

<servlet> 
    <servlet-name>springmvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:springmvc-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Ahora bien, hay algunos módulos que deben ser cargados en tiempo de ejecución utilizando un ContextSingletonBeanFactoryLocator. Por lo tanto, cada módulo tiene su propio ClasspathXmlApplicationContext. Para que un módulo pueda hacer referencia a los beans del XmlWebApplicationContext, debe adjuntarse al XmlWebApplicationContext para formar una Jerarquía de contexto en la que el XmlWebApplicationContext debe desempeñar el papel del elemento primario y el ClasspathXmlApplicationContext del módulo El rol del contexto secundario. Desafortunadamente no soy capaz de conectarlos mediante

<beans> 
    <bean id="moduleContext" 
     class="org.springframework.context.support.ClassPathXmlApplicationContext"> 
     <constructor-arg> 
      ... 
     </constructor-arg> 
     <constructor-arg ref="parentContext" /> 
    </bean> 
</beans> 

porque he encontrado ninguna manera en lo que va a dar a la WebApplicationContext el nombre parentContext. ¿He pasado por alto algo o hay una forma mejor/más fácil de lograr lo mismo de una manera diferente?

Respuesta

2

Si está utilizando anotaciones, usted puede hacer esto:

@Inject 
private XmlWebApplicationContext context; 

@Inject 
private List<ClassPathXmlApplicationContext> childs; 

@PostConstruct 
public void refreshContext() { 
    for(ClassPathXmlApplicationContext appContext : childs) { 
     appContext.setParent(context); 
    } 
    context.refresh(); 
} 

Usted puede hacerlo sin anotaciones también, usando las interfaces InitializingBean y ApplicationContextAware.

Editado:childs se autowired por tipo, por lo que la primavera inyectará todo el grano que se están una instancia de ClassPathXmlApplicationContext.

+0

¿De dónde saco 'childs' si no los conozco de antemano? – aha

+0

Probé el código que propones. Funciona, pero no se propaga al 'ContextSingletonBeanFactoryLocator'. Pero conduce en la dirección correcta: el camino a seguir es no utilizar un 'ContextSingletonBeanFactoryLocator' sino cargar manualmente los contextos secundarios (usando un' GenericApplicationContext') y adjuntarlos al contexto principal en un 'InitializingBean'. – aha

Cuestiones relacionadas