Parent Application Context in Spring boot

2.8k Views Asked by At

I have the following in non-boot spring application, ear application with 2 wars, How do I implement the same in a spring-boot application

In the Service layer:

    @Configuration
    @ComponentScan("")
    @Import({..})
    public class BaseConfig implements ApplicationContextAware {
    private ApplicationContext parentContext;
    @Bean(name = "earParentContext")
    public ApplicationContext parentContextKey() {
        return this.parentContext;
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
        this.parentContext = applicationContext;
    }
}

beanRefContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  <context:annotation-config />
  <context:component-scan resource-pattern="BaseConfig.class" base-package="com.pkg.sa.config"
    annotation-config="true" />
</beans>

War1 Initializer with ParentContext

public class War1Initializer implements WebApplicationInitializer {
@Override
    public void onStartup(final ServletContext container) throws ServletException {
    ServletRegistration.Dynamic war1Servlet = container.addServlet("war1Dispatcher", new DispatcherServlet());
        war1Servlet.setInitParameter("contextClass", AnnotationConfigWebApplicationContext.class.getName());
        war1Servlet.setInitParameter("parentContextKey", "earParentContext");
        war1Servlet.setLoadOnStartup(1);
        war1Servlet.addMapping("/");

        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.setDisplayName("AbcNx");

        // Registers the application configuration with the root context
        BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance("classpath:beanRefContext.xml");
        BeanFactoryReference parentContextRef = locator.useBeanFactory("earParentContext");
        ApplicationContext parentContext = (ApplicationContext) parentContextRef.getFactory();
        rootContext.setParent(parentContext);

        rootContext.register(War1WebMvcConfigurer.class);
    }
}

War2 Initializer with ParentContext

public class War2Initializer implements WebApplicationInitializer {
@Override
    public void onStartup(final ServletContext container) throws ServletException {
    ServletRegistration.Dynamic war2Servlet = container.addServlet("war2Dispatcher", new DispatcherServlet());
        war2Servlet.setInitParameter("contextClass", AnnotationConfigWebApplicationContext.class.getName());
        war2Servlet.setInitParameter("parentContextKey", "earParentContext");
        war2Servlet.setLoadOnStartup(1);
        war2Servlet.addMapping("/");

        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.setDisplayName("AbcNx");

        // Registers the application configuration with the root context
        BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance("classpath:beanRefContext.xml");
        BeanFactoryReference parentContextRef = locator.useBeanFactory("earParentContext");
        ApplicationContext parentContext = (ApplicationContext) parentContextRef.getFactory();
        rootContext.setParent(parentContext);

        rootContext.register(War2WebMvcConfigurer.class);
    }
}
1

There are 1 best solutions below

0
On

Spring Boot uses DispatcherServletAutoConfig to initialize a default DispatcherServlet. So you need to customize the default DispatcherServlet in the following way :

    @Bean
    public DispatcherServlet dispatcherServlet()
    {
        DispatcherServlet servlet = new DispatcherServlet();

        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.setDisplayName("Self Administration Nx");

        // Registers the application configuration with the root context
        rootContext.setConfigLocation("com.xyz.mnp.config");
        BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance("classpath:beanRefContext.xml");
        BeanFactoryReference parentContextRef = locator.useBeanFactory("sharedContext");
        ApplicationContext parentContext = (ApplicationContext) parentContextRef.getFactory();
        rootContext.setParent(parentContext);
        rootContext.register(WebConfigurer.class);
        servlet.setApplicationContext(rootContext);
        return servlet;
    }