03-application.yml逐行解读-端口-H2-JPA配置大家好我是黒漂技术佬。上篇讲完 pom.xml本篇逐行啃application.yml——这是 URM Ultra 后端的唯一配置文件没有 application.properties。工程能不能连上库、监听哪个端口、Swagger 在哪开全在这一个文件里。先说个新手常识Spring Boot 同时支持.properties老式keyvalue和.yml树形缩进两种格式。URM Ultra 用 yml因为它层级清晰、可读性强写复杂配置不累。一、yml 的语法铁律先避坑动手读之前必须记住 yml 的两个雷规则说明反例缩进用空格不用 Tabyml 靠缩进表达层级Tab 会解析失败用 Tab 缩进冒号后必须有空格key: value的:后至少一个空格port:8080错记住这俩你 90% 的 yml 报错都没了。二、完整配置一览项目源码server:port:8080spring:application:name:urm-server# 演示环境H2 内存库零外部依赖可直接运行datasource:url:jdbc:h2:mem:urm_ultra;MODEMySQL;DATABASE_TO_LOWERTRUE;CASE_INSENSITIVE_IDENTIFIERSTRUE;DB_CLOSE_DELAY-1driver-class-name:org.h2.Driverusername:sapassword:h2:console:enabled:truepath:/h2-consolejpa:hibernate:ddl-auto:updateopen-in-view:falseshow-sql:falseproperties:hibernate:format_sql:true# 兼容 H2 与 MySQL 表名default_schema:PUBLIC# 生产环境切换 MySQL取消注释并改为真实配置# datasource:# url: jdbc:mysql://127.0.0.1:3306/urm_ultra?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse# driver-class-name: com.mysql.cj.jdbc.Driver# username: root# password: rootspringdoc:swagger-ui:path:/swagger-ui.htmltags-sorter:alphaapi-docs:path:/v3/api-docsmanagement:endpoints:web:exposure:include:health,info# 业务自定义配置urm:# 微信支付分免密支付Demo 使用 Mock接入真实微信时在此配置wechat-pay:enabled:falsemch-id:app-id:service-id:# 微信支付分服务 IDapi-v3-key:# APIv3 密钥生产禁止提交真实密钥# 视觉识别Demo 使用 Mock接入三方算法时配置vision:provider:mock# mock / third-partyendpoint:api-key:下面逐段拆。三、server服务监听端口server:port:8080项含义server.port内嵌 Tomcat 监听的端口默认就是 8080为什么常用 8080它是 HTTP 代理常用的「备选端口」避开 80需管理员权限又不冲突。想换端口比如 9090直接改这里就行。联调时前端访问http://localhost:8080就对应这个端口。四、spring.application.name应用名spring:application:name:urm-server给应用起个名字注册到服务发现、或在日志/监控里区分应用时用。URM Ultra 后端就叫urm-server。五、datasourceH2 内存库本篇重点datasource:url:jdbc:h2:mem:urm_ultra;MODEMySQL;DATABASE_TO_LOWERTRUE;CASE_INSENSITIVE_IDENTIFIERSTRUE;DB_CLOSE_DELAY-1driver-class-name:org.h2.Driverusername:sapassword:5.1 为什么是 H2 内存库H2 是个纯 Java 写的嵌入式数据库可以跑在内存里mem:不写磁盘文件、不用装服务。对 Demo 来说简直完美克隆工程 → 启动 → 自动建表灌数据 → 直接玩。5.2 那串 URL 参数是啥逐个翻译很多新手被这一长串吓到其实每个分号隔开的就是一个开关参数片段含义jdbc:h2:mem:urm_ultra用 H2 的「内存模式」库名urm_ultraMODEMySQL关键让 H2 的 SQL 语法兼容 MySQL 模式。这样你写 MySQL 风格的 SQLH2 也能跑将来切 MySQL 几乎无缝DATABASE_TO_LOWERTRUE把数据库名、表名转小写避免大小写差异导致的建表异常CASE_INSENSITIVE_IDENTIFIERSTRUE标识符表名/列名大小写不敏感进一步兼容 MySQL 习惯DB_CLOSE_DELAY-1关键VM 存活期间不关闭内存库。默认 H2 在「没有连接」时会清空内存数据设-1防止你关掉一个连接后数据全没了一句话总结这套参数组合是为了让「内存里的 H2」表现得像一个「小号 MySQL」最大化降低 Demo 与生产环境的差异。5.3 账号与驱动项值说明driver-class-nameorg.h2.DriverH2 的 JDBC 驱动类usernamesaH2 默认超级管理员账号password空演示库无密码六、h2.console可视化看数据库h2:console:enabled:truepath:/h2-console项含义enabled是否开启 H2 自带的控制台Web 界面path访问路径开启后浏览器访问http://localhost:8080/h2-console就能用图形界面看表、写 SQL。登录时 JDBC URL 填上面那段jdbc:h2:mem:urm_ultra;...用户名sa、密码空即可进去。联调时查「为什么这条数据没存进去」非常方便。七、jpa对象怎么落库本篇另一重点jpa:hibernate:ddl-auto:updateopen-in-view:falseshow-sql:falseproperties:hibernate:format_sql:truedefault_schema:PUBLIC7.1 ddl-auto自动建表策略hibernate.ddl-auto决定「Java 实体类」和「数据库表」怎么同步取值行为适用create每次启动删表重建纯测试数据会没create-drop启动建、关闭删单元测试update启动时按实体改表结构不删数据开发URM Ultra 用的就是这个none完全不管表生产表由 DBA 管validate只校验实体与表是否一致生产保守URM Ultra 用update你加个字段重启它就自动给表加列已有数据还在。对 Demo 和开发最省心。7.2 open-in-view关掉「视图层还开着事务」open-in-view: false是个性能与规范相关的开关。默认true时Spring 会在整个请求从 Controller 到页面渲染期间一直开着 Hibernate 的 Session方便模板里懒加载。但副作用明显事务被拉长、容易触发经典的「N1 查询」性能坑、数据库连接占用久。URM Ultra 显式设false逼着你在 Service 层就把数据查全、查好事务边界干净。这是有经验的团队都会这么做的最佳实践。7.3 show-sql / format_sql项值含义show-sqlfalse是否把执行的 SQL 打到控制台生产关掉避免刷屏format_sqltrue把 SQL 格式化缩进换行配合 show-sql 看更清楚注意show-sql在 yml 顶层jpa下而format_sql在jpa.properties.hibernate下直接透传给 Hibernate 原生属性。两者层级不同但都生效。7.4 default_schema默认 schemadefault_schema: PUBLIC指定表默认落在PUBLIC这个 schema 下。写它主要是为了同时兼容 H2 和 MySQL 的表名解析避免切换数据库后找不到表。八、生产切换 MySQL注释里藏着# datasource:# url: jdbc:mysql://127.0.0.1:3306/urm_ultra?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse# driver-class-name: com.mysql.cj.jdbc.Driver# username: root# password: root这段是注释掉的。上线时把上面 H2 的datasource注释掉、把这段放开即可。代码一行不用改靠 JPA 的数据库无关性平滑切换。源码注释特别强调「生产禁止提交真实密钥」——密码别写进仓库。九、springdoc接口文档springdoc:swagger-ui:path:/swagger-ui.htmltags-sorter:alphaapi-docs:path:/v3/api-docs项值含义swagger-ui.path/swagger-ui.html文档界面地址tags-sorteralpha文档里按标签字母排序api-docs.path/v3/api-docsOpenAPI JSON 文档地址联调时打开http://localhost:8080/swagger-ui.html每个接口都能直接填参数点「Try it out」试调比 Postman 还顺手。十、management健康检查management:endpoints:web:exposure:include:health,infoActuator 有一堆端点但默认只暴露health和info避免把内部信息如所有 Bean、环境变量暴露出去造成安全风险。访问http://localhost:8080/actuator/health返回{status:UP}即健康。十一、urm业务自定义前缀重点概念urm:wechat-pay:enabled:falsemch-id:app-id:service-id:api-v3-key:vision:provider:mockendpoint:api-key:这是 URM Ultra自己定义的配置前缀。约定业务私有配置用项目代号urm开头避免和 Spring 自带配置撞名。前缀用途当前值含义urm.wechat-pay.*微信支付分免密支付配置enabled: false→ 走 Mock 支付urm.vision.*视觉识别配置provider: mock→ 走 Mock 识别这两个模块现在都是Mock模拟实现不接真实微信、不跑真实视觉算法但留好了接口和配置位。将来接真实服务只需实现对应接口、把enabled/provider改成非 mock、填好密钥即可业务代码无感切换。这叫「策略可插拔」是 URM Ultra 架构上很讲究的一点。十二、本篇小结yml 用空格缩进、冒号后留空格别用 Tab。端口默认8080应用名urm-server。H2 内存库那串 URL 用MODEMySQLDB_CLOSE_DELAY-1等参数让它假装成一个小 MySQL。JPA 用ddl-auto: update自动建表不丢数据、open-in-view: false干掉长事务坑。Swagger 在/swagger-ui.htmlActuator 只暴露 health/info。自定义urm.wechat-pay/urm.vision前缀目前都走 Mock。下一篇我们回到启动类UltraApplication把SpringBootApplication这个「魔法注解」拆成三个注解讲清楚。