“约定优于配置”指Spring Boot为80%常见场景预设默认行为,仅在例外时需显式干预;如starter-web自动启用内嵌Tomcat、DispatcherServlet等,删application.properties仍可启动,默认端口8080、静态资源路径classpath:/static/。

“约定优于配置”不是让你不写配置,而是让 80% 的常见场景自动跑起来,你只在破例时才干预。
为什么 Spring Boot 启动一个 Web 项目连 web.xml 和 DispatcherServlet 都不用配?
因为 Spring Boot 把“典型 Java Web 应用该长什么样”提前写死了:比如类路径里有 spring-boot-starter-web,就默认启用内嵌 Tomcat、注册 DispatcherServlet、加载 ViewResolver、开启静态资源映射(/static、/public)——这些不是靠你手写 XML 或 @Bean 堆出来的,是它扫描到依赖后,按约定自动触发的。
- 你删掉
application.properties,服务照样能启动,默认端口8080,根路径/,静态文件走classpath:/static/ - 你加一行
server.port=9090,它就只改端口;加spring.mvc.view.prefix=/WEB-INF/jsp/,它就切视图解析逻辑——改的是“例外”,不是从零搭架子 - 容易踩的坑:
spring-boot-starter-web默认不支持 JSP(内嵌 Tomcat 不扫描/WEB-INF),这不是 bug,是约定:它推荐 Thymeleaf 或纯 REST,你要硬上 JSP 就得手动配ServletWebServerFactory+ 外置容器,这恰恰印证了“破例需显式干预”
@EnableAutoConfiguration 怎么知道该配数据源还是不该配?
它不猜,它查——查类路径有没有 DataSource 类、有没有 HikariCP 或 TomcatJdbc jar、有没有 spring.datasource.url 这类配置项。三者缺一不可,才真正创建 DataSource Bean。
-
@ConditionalOnClass(DataSource.class):没引入 JDBC 依赖,整个DataSourceAutoConfiguration类直接跳过 -
@ConditionalOnMissingBean:你已经自己写了@Bean DataSource,它的自动配置就让位 - 常见错误现象:
Caused by: java.lang.NoClassDefFoundError: javax/sql/DataSource—— JDK 9+ 模块化后javax.sql不再默认导出,得加--add-modules java.sql,否则连“有没有DataSource”都判断失败,自动配置直接静默失效
自定义配置覆盖默认值时,哪些地方容易“覆盖失败”?
不是所有属性都能被 application.yml 覆盖,有些必须用特定方式介入,否则约定仍占上风。
-
spring.http.log-request-details=true在 Spring Boot 2.2+ 已废弃,换成了logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG—— 写错 key 就白配 - 想换 Jackson 的日期格式?
spring.jackson.date-format只对@ResponseBody生效;若用了ObjectMapper手动序列化,得自己 setSimpleDateFormat,这里约定管不到手动调用 - 多环境配置别名写成
spring.profiles.active=prod,但实际 profile 名是production,结果 dev 配置照常加载——约定要求 profile 名严格匹配,拼写/大小写错就失效
最常被忽略的一点:约定不是写在文档里的“建议”,而是硬编码在 META-INF/spring.factories 和条件注解里的逻辑分支。你看不到它执行,但它每秒都在做判断;你改配置时,得先确认那个配置项是否真被当前激活的自动配置类所消费——否则,它根本不会读你写的那一行。










