我正在编写一个Spring Boot应用程序,该应用程序使用几个@Configuration类之一,具体取决于文件中@Profile设置的类application.properties。
@Configuration
@Profile
application.properties
这些配置类之一使用REST接口,因此,我将其包括spring-boot-starter-web为依赖项。
spring-boot-starter-web
这将启动嵌入式Tomcat实例,这很好。
问题是,其他配置文件不需要嵌入式服务器(例如,我使用JMS来处理传入消息而不是REST)。
有没有什么方法可以阻止@SpringBootApplicationTomcat在默认情况下启动,而仅将其用于REST Configuration类?例如,通过用@EnableWebMVC
@SpringBootApplicationTomcat
@EnableWebMVC
这是我的@Configuration课程的一个示例:
REST:
@Profile({"REST"}) @Configuration @EnableWebMvc public class HttpConfiguration{ . . . }
JMS:
@Profile({"JMS"}) @Configuration @EnableJms public class JMSConfiguration{ . . . }
谢谢
使用
@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, WebMvcAutoConfiguration.class})
排除Spring Boot对嵌入式Servlet容器的自动配置。此外,你需要为非REST案例设置以下属性,以使Spring Boot不会尝试启动REST WebApplicationContext(需要一个servlet容器):
WebApplicationContext
spring.main.web-environment=false
然后通过导入在REST配置文件中启用嵌入式Tomcat EmbeddedServletContainerAutoConfiguration.class(这将自动配置延迟到REST配置文件加载后:
Tomcat EmbeddedServletContainerAutoConfiguration.class
@Profile({"REST"}) @Configuration @Import(EmbeddedServletContainerAutoConfiguration.class) public class HttpConfiguration { // ... }
如果使用任何EmbeddedServletContainerCustomizer,还需要导入EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class。
EmbeddedServletContainerCustomizer
EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class