首先启动类使用了@SpringBootApplication注解,这个复合注解包括了@EnableAutoConfiguration、@SpringBootConfiguration和@ComponentScan三个注解,@SpringBootConfiguration是标注当前类是一个配置类并注入到IOC容器中,而@ComponentScan是扫描指定路径下带有特定注解的类到IOC容器中。最为重要的是@EnableAutoConfiguration,它能通过ImportSelector选择器将所有带有@Confiquration自动导入到容器里注解完成后,通过运行SpringApplication的run方法完成服务构建、环境准备、容器创建、填充容器四项工作。
1.服务构建需要在SpringApplication的构造器中完成
1.加载资源加载器、主方法类到内存中,
2.判定web应用类型是否存在并默认为servlet,
3确定web服务器后就要加载初始化类了,这里是通过META-NFO/spring.factories来读取启动注册初始化器、应用上下文初始化器、应用 监听器三类配置,当然,这里也可以对自定义三类配置,通过运行时栈判断main方法所在的类是否为主启动类
2.调用run方法进入环境准备阶段,主要是对容器和组件做一些前置操作。
1.先创建一个启动上下文。并逐一调用刚刚加载的启动注册初始化器的一个初始化方法
2.接下来设置awt.headLess=true表示缺少显示器、键盘等设备也可正常启动
3.启动运行监听器,同时发布启动事件,获取并加载spring.factories中的事件发布运行监听器,并且会将应用监听器也一并引入,以后想要在启动流程过程中加入自定义逻辑就只需要监听这些事件
4. 通过prepareEnvironment方法组装启动参数,根据不同的web构造不同的环境。构造完毕后会加载环境变量、jvm系统属性到属性集合中,后期无需加载。此时可设置启动参数并添加configuration.properties到属性集合中。接下来会发布环境准备完成的事件,一些监听器收到信号会做相应处理。
5. 可做忽略元数据加载、打印banner的操作。
3.环境准备好以后,就可以创建容器了。
1.首先创建注解配置servlet容器,具体行为是创建beanfactory.用来解析一些注解的后置处理器和其他属性对象
2调用prepareContext方法对容器中的属性进行初始化
4.容器创建完毕后,就会对容器做初始化操作。
1.创建系统自带的Bean和用户自定义Bean并装配到容器里,通过启动tomcat和经历Bean的生命周期就可以使用一个完整的Bean了
2.发布启动事件完成的同时,会回调自定义Runner接口来处理定制化需求