文章目录先说结论什么是约定优于配置Spring Boot的核心约定约定一项目结构约定二默认配置约定三默认Bean约定四Starter命名约定约定能改吗当然能约定优于配置的代价回答技巧与点评加分回答面试官点评个人网站“约定优于配置”Convention over Configuration是 Spring Boot 的灵魂但很多人对它的理解停留在少写配置的层面。面试官问这题他想听的是Spring Boot 到底约定了什么这些约定能不能改改了会怎样先说结论维度说明核心思想有合理的默认值开发者只需关注不符合约定的部分目的减少决策成本提升开发效率体现默认配置、默认目录结构、默认 Bean、默认行为灵活性约定可覆盖通过配置文件或自定义 Bean一句话记住约定优于配置就是公司有规章制度不用你每次都问该怎么办——按规矩来就行想改也行什么是约定优于配置想象你入职一家公司没有约定每天上班你都得问工位在哪电脑用什么系统代码放哪个目录——效率极低有约定工位按部门分配、电脑统一 macOS、代码放 ~/projects/——不用问直接干想改也行你可以申请换工位、用自己电脑、改代码目录——但得主动申请Spring Boot 就是这家有约定的公司。Spring Boot的核心约定约定一项目结构src/main/java/com/example/ ├── Application.java ← 启动类放在根包 ├── controller/ ← Controller 放这里 ├── service/ ← Service 放这里 ├── repository/ ← DAO 放这里 └── config/ ← 配置类放这里 src/main/resources/ ├── application.yml ← 配置文件固定名字 ├── static/ ← 静态资源 └── templates/ ← 模板文件你不按这个结构来也能跑但按约定来最省事——ComponentScan 从主类所在包开始扫描放对了位置自动被扫描到。约定二默认配置配置项默认值修改方式端口8080server.port9090上下文路径/server.servlet.context-path/api数据源H2 内存数据库spring.datasource.*日志级别INFOlogging.level.rootDEBUGJSON 日期格式时间戳spring.jackson.date-formatyyyy-MM-dd不用配任何东西一个 SpringBootApplication 就能启动 Web 服务。想改在 application.yml 里写一行覆盖。约定三默认BeanSpring Boot 的自动配置类会按条件注册默认 BeanAutoConfigurationConditionalOnClass(DataSource.class)// classpath 有 DataSource 才生效ConditionalOnMissingBean(DataSource.class)// 你没自定义才注册默认的publicclassDataSourceAutoConfiguration{BeanpublicDataSourcedataSource(){returnnewHikariDataSource();// 默认 HikariCP}}关键注解ConditionalOnMissingBean——你自定义了就用你的没有才用默认的。这就是约定优于配置的精髓默认给你最好的你想换随时换。约定四Starter命名约定Starter功能spring-boot-starter-webWeb 开发spring-boot-starter-data-jpaJPA 数据访问spring-boot-starter-data-redisRedisspring-boot-starter-security安全认证官方 Starter 命名spring-boot-starter-*第三方 Starter 命名*-spring-boot-starter看到名字就知道干什么的这也是约定。约定能改吗当然能Spring Boot 的约定不是强制而是默认值。三种覆盖方式1. 配置文件覆盖server:port:9090# 覆盖默认的 80802. 自定义 Bean 覆盖ConfigurationpublicclassMyConfig{BeanpublicObjectMapperobjectMapper(){returnnewObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);// 你的 ObjectMapper 替代默认的}}3. 排除自动配置SpringBootApplication(exclude{DataSourceAutoConfiguration.class})// 不要数据源的自动配置约定优于配置的代价优点代价快速开发默认行为可能不符合需求减少样板代码出问题时排查困难不知道默认配了什么团队统一过度依赖约定缺乏理解就像公司规章提高效率但新员工可能不理解为什么这样做。Spring Boot 的约定也是如此——用起来爽但出了问题得理解底层才能排查。约定优于配置全景 核心约定 ├── 项目结构 —— 包扫描从主类根包开始 ├── 默认配置 —— 端口8080、H2数据库、HikariCP ├── 默认Bean —— ConditionalOnMissingBean 条件注册 ├── Starter命名 —— spring-boot-starter-* 官方命名 └── 配置文件 —— application.yml 固定名称 覆盖方式 ├── 配置文件application.yml ├── 自定义 BeanConditionalOnMissingBean └── 排除自动配置exclude 口诀约定优于配置好默认值来开箱跑 端口8080数据源想改随时能覆盖 自定义Bean优先级高排除配置也能搞 省心省力效率高出了问题得懂行回答技巧与点评标准回答约定优于配置是 Spring Boot 的核心设计理念指框架提供合理的默认值和规范开发者只需关注不符合约定的部分。Spring Boot 的约定包括默认端口 8080、默认内嵌 Tomcat、默认 HikariCP 数据源、默认包扫描从主类所在包开始、默认配置文件 application.yml 等。这些约定都可以通过配置文件、自定义 Bean 或排除自动配置来覆盖。加分回答ConditionalOnMissingBean 的意义这是约定优于配置的技术保障——自动配置类注册默认 Bean 前先检查容器中是否已有有则跳过。你的自定义 Bean 永远优先于默认 BeanSpring Boot 的 opiniated有主见的Spring Boot 替你做了很多技术选型决策HikariCP 优于 DBCP、Lettuce 优于 Jedis、Logback 优于 Log4j这些选择都是经过社区验证的最佳实践与 Ruby on Rails 的渊源约定优于配置的理念最早来自 RailsSpring Boot 借鉴了这个思想但保留了 Spring 的灵活性——约定不是强制面试官点评这道题考的是你对Spring Boot 设计哲学的理解。能说出减少配置是表面面试官想听的是具体约定了什么、约定能不能改、ConditionalOnMissingBean 是怎么保证你自定义的优先的。如果能把 Spring Boot 的有主见特性也讲出来说明你理解了它的价值主张。原文阅读内容有帮助点赞、收藏、关注三连评论区等你