SpringBoot项目启动过程源码终于整体捋了一遍(一)

写在前面:这几天撸这段源码过程中,发现好多东西之前都忽视了,所以决定连载几篇,把之前漏掉的、现在想起来了的,都整理总结下来。

Spring Boot项目启动过程这个问题过于经典,之前也是能说上来一点,但是说实话,源码都是一个片段一个片段的看过,没有系统性地连起来,这几天从头开始捋了一遍,也不是闲的无聊,是因为确实遇到了一个问题。

问题是这样的:现在项目部署一般都分测试环境和生成环境甚至更多,不同环境中有些配置势必会存在差异,Spring Boot提供了一种快捷的方式去切换配置文件,即将不同环境的配置文件分开,命名规则为application-{env}.yml,如下:

 启动jar包时加上启动参数--spring.profiles.active={env},即可以切换对应env的环境配置文件,如下:

这种切换配置文件的方式很方便也很常用,之前也都是照葫芦画瓢地用着,也没想过为什么这样就行了,最近新开发了一个服务,从启动类开始写的那种开发,然后自己写了一个启动类,是这样的:

 关注蓝色选中部分,或许有人已经发现问题了。在准备部署的时候暴露了问题,准备用--spring.profiles.active={env}启动命令切换配置文件时,怎么试都无效,竟然是因为这个run()方法我没有将args参数传递进去,正确的写法应该是这样:

扫描二维码关注公众号,回复: 10189549 查看本文章

 要说坏还是这个run方法坏,后面那个参数是一个变长参数:

不传的话就是一个空数组,也不报错,如果项目不涉及一些启动命令的话,不传args还是开开心心的跑。可我之前真的没有关注这个,拍破脑袋也想不到这个args和启动命令参数有关啊,虽然两者很容易联系到一起,都是参数嘛。今天踩了雷,所以决定把Spring Boot的启动过程整体梳理一遍,就从这个坏坏的run()方法开始。

这个run()方法将主源类封装为数组调用了该类中另一个run()方法:

可知启动的时候主源类可以有多个,SpringApplication也提供了添加主源类的方法:

被调用的run()方法可以看出来是分两步,即:

1.new SpringApplication() 利用主源类primarySources初始化SpringApplication类

2.调用SpringApplication的run()方法启动项目,并传递参数args,run()方法着实有点多容易乱。

这两个过程需要详细的总结,所以放在下篇,这篇先是抛出了一个生产中遇到的问题,然后带着问题对Spring Boot启动过程源码撸了个开头。 

发布了76 篇原创文章 · 获赞 57 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/weixin_42447959/article/details/104928065