Spring引导中的父应用程序上下文

时间:2016-12-29 23:34:10

标签: java spring spring-mvc spring-boot spring-annotations

我在非启动弹簧应用程序中有以下内容,2个战争的耳朵应用程序,如何在spring-boot应用程序中实现相同的功能

在服务层:

    @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>

带有ParentContext的War1初始化程序

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);
    }
}

使用ParentContext的War2初始化程序

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 个答案:

答案 0 :(得分:1)

Spring Boot使用DispatcherServeletAutoConfig初始化默认的DispatcherServlet。因此,您需要按以下方式自定义Default Dispatcher Servlet:

    @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;
    }