鉴于Spring Boot应用程序由一个引导程序模块和两个或多个独立的业务模块组成 - 每个模块都公开了特定于业务域的REST API,并且每个模块都使用独立的隔离文档存储来实现数据持久性,我该如何进行关于配置这样的应用程序,例如:
为了隔离各个业务模块的上下文(允许我在每个模块中管理独立的存储库配置),我尝试使用SpringApplicationBuilder中可用的上下文层次结构来隔离每个业务模块的上下文:
public class Application {
@Configuration
protected static class ParentContext {
}
public static void main(String[] args) throws Exception {
new SpringApplicationBuilder(ParentContext.class)
.child(products.config.ModuleConfiguration.class)
.web(true)
.sibling(orders.config.ModuleConfiguration.class)
.web(true)
.run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于每个模块都包含一个使用@EnableAutoConfiguration注释的配置类,这会导致Spring Boot尝试启动两个独立的嵌入式servlet容器,每个容器都尝试绑定到同一个端口:
@Configuration
@EnableAutoConfiguration
public class WebApplicationConfiguration {
@Value("${api.basePath:/api}")
protected String apiBasePath;
@Bean
public DispatcherServlet dispatcherServlet() {
return new DispatcherServlet();
}
@Bean
public ServletRegistrationBean dispatcherServletRegistration() {
ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet(),
apiBasePath + "/products/*");
registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
return registration;
}
}
Run Code Online (Sandbox Code Playgroud)
关于上下文层次结构的Spring Boot文档指出父上下文不能是Web上下文,所以我对如何在隔离的子上下文之间共享嵌入式servlet容器感到有点迷茫. …