必须使用@ConditionalOnWebApplication注解使配置类或Bean仅在Web环境下生效,其type属性可指定SERVLET、REACTIVE或ANY类型;配合@ConditionalOnMissingBean避免Bean冲突,或用@ConditionalOnNotWebApplication禁用非Web模块的Web配置。

在Spring Boot中,当需要让某个配置类或Bean只在Web应用环境下生效时,必须使用@ConditionalOnWebApplication注解,否则非Web项目启动会因找不到Servlet相关类而报错或加载冗余组件。
区分Web应用类型
Spring Boot将Web应用细分为三类:任意Web应用(SERVLET或REACTIVE)、传统Servlet容器应用(如Spring MVC)、响应式Web应用(如Spring WebFlux)。注解的type属性决定匹配粒度。
第一步:在@Configuration类上添加@ConditionalOnWebApplication,并显式指定type值。
第二步:若仅需适配Spring MVC项目,使用@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET);若仅适配WebFlux,则用Type.REACTIVE;若两者皆可,保留默认Type.ANY即可。
第三步:注意Type.ANY会同时匹配Servlet和Reactive环境,但不会匹配非Web项目——这是它与@ConditionalOnNotWebApplication互斥的关键前提。
配合@ConditionalOnMissingBean做安全兜底
方法一:在Web专属配置中,为避免用户已定义同类型Bean导致冲突,用@ConditionalOnMissingBean限定注册时机。
@Bean
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnMissingBean(WebMvcConfigurer.class)
public WebMvcConfigurer customWebMvcConfigurer() { ... }
这一步必须加@ConditionalOnMissingBean,否则当项目引入了第三方Web配置类时,Spring会抛出BeanDefinitionOverrideException异常。
在非Web模块中禁用Web配置
方法二:直接用@ConditionalOnNotWebApplication反向控制。
@Configuration
@ConditionalOnNotWebApplication
public class NonWebOnlyConfig { ... }
该配置类仅在打包为JAR且未引入spring-boot-starter-web时生效。若项目同时含web和non-web模块,此注解能防止Web相关Bean被错误注入到命令行工具模块中。
【注意】@ConditionalOnNotWebApplication与@ConditionalOnWebApplication不可同时用于同一配置类,否则条件永远无法满足。
验证是否生效
运行项目后,检查日志中是否出现类似Loaded configuration class xxx from spring.factories的记录;若未出现,说明条件未满足。
更直接的方式是,在配置类中加一个@PostConstruct方法打印日志,观察其是否被执行。
这一步操作起来很简单,直接启动应用并查看控制台输出即可确认。

















