温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
一个只有几行的main为什么能拉起整个Java web系统?移动一个包名,又为什么会让一批B消失?今天我们把启动链路拆开看。Spring application run不是魔法,它按固定顺序推进,先准备environment,再创建application context, 然后扫描definition,最后实例化并并启动内嵌服务器。那tomcat data source GPA这些组件分别在哪一步出现?为什么有时候端口冲突,应用还没到web server阶段就挂了?Environment阶段读取配置source和GPA在并创建阶段出现,在最后web server阶段启动。端口冲突通常发生在web server启动前。如果配置错误,应用可能死在environment阶段,并创建失败时在context的阶段,端口冲突死在web server阶段。
01:00
日志里的异常战能直接定位阶段。那为什么移动一个包名bam就消失了?Component scan和entity扫描的边界到底由什么决定?主application所在的root package是默认扫描根。Configurationt和resity扫描都从这个灯开始。如果把启动类或配置放到错误位置,是不是有些B根本不会被扫描到,但应用还能正常启动?对,扫描遗漏不会报错,只会让一批病静没消失。主动把病或配置放到错误位置,就能观察到依赖注入失败或功能缺失。还要注意,配置错误可能暴露敏感信息,比如数据源配置放错包可能加载了默认配置,连接了错误的数据库。实战里可以加入application runner和启动事件监听器,观察application event触发时机,确认所有病和服务器都已就绪。
02:05
所以main只是入口,真正拉起系统的是spring的固定启动链。扫描边界由root package决定,移动报名就会改变B的可见范围。
我来说两句