文档

java体系技术文档


Springboot启动

<h2>1、入口:@SpringBootApplication注解的Application类的main方法</h2> <pre><code>1.1注解@SpringBootApplication 1.1.1 @SpringBootConfiguration:和@Configuration有相同的作用,配备了该注解的类就能够以JavaConfig的方式完成一些配置 1.1.2 @ComponentScan:自动扫描功能 1.1.3 @EnableAutoConfiguration:自动配置</code></pre> <h2>2、SpringApplication的实例化,主要是对一些属性附上初始值,关键还在与SpringApplication对象的initialize方法。</h2> <pre><code>2.1 SpringApplication对象的initialize方法,主要做了四件事 2.1.1 推断当前应用程序是不是一个Web应用程序,通过在classpath中查看是否存在WEB_ENVIRONMENT_CLASSES这个数组中所包含的类,如果存在那么当前程序即是一个Web应用程序,反之则不是。 2.1.2 设置初始化器(Initializer),这里会尝试从类路径的META-INF/spring.factories处读取相应配置文件中Key为:org.springframework.context.ApplicationContextInitializer的value。 SpringApplication对象的成员变量initalizers就被初始化为spring.factories文件中ApplicationContextInitializer对应的value(类)的对象组成的list(这是默认的成员变量initalizers初始化)。 2.1.3 设置监听器(listener),和上面设置初始化器一样,这里会尝试从类路径的META-INF/spring.factories处读取相应配置文件中Key为:org.springframework.context.ApplicationListener的value。 SpringApplication对象的成员变量listeners就被初始化为spring.factories文件中ApplicationListener对应的value(类)的对象组成的list。 2.1.4 推断应用入口类。通过获取当前调用栈,找到入口方法main所在的类,并将其复制给SpringApplication对象的成员变量mainApplicationClass。 至此,已经构造完SpringApplication对象了,之后就是调用该对象的run方法来运行spring boot项目。</code></pre> <h2>3、调用run方法来运行SpringBoot项目</h2> <pre><code>3.1 StopWatch 是一个计时工具,可以用来方便的记录程序的运行时间。 3.2 this.configureHeadlessProperty(),设置java.awt.headless系统属性为true - 没有图形化界面 3.3 获取SpringApplicationRunListeners,仍然利用了getSpringFactoriesInstances方法来获取实例,从META-INF/spring.factories中读取SpringApplicationRunListener的value(EventPublishingRunListener),它主要是负责发布SpringApplicationEvent事件的。 有发布就有监听,在构建SpringApplication实例的时候不是初始化过一些ApplicationListeners嘛,其中的Listener就可能会监听ApplicationEnvironmentPreparedEvent事件,然后进行相应处理。 3.4 根据SpringApplicationRunListeners以及参数来准备环境,配置了properties和Profiles。SpringApplicationRunListeners实际上是一个事件中转器,它能够感知到Spring Boot启动过程中产生的事件,然后有选择性的将事件进行中转。 3.5 准备banner打印器 3.6 调用createApplicationContext获取创建ApplicationContext(IOC容器、Spring上下文),准备异常报告器 3.7 Spring上下文前置处理 3.6.1 将环境和上下文关联起来 3.6.2 为上下文配置Bean生成器以及资源加载器(如果它们非空) (关键步骤) 3.6.3 调用初始化器 (关键步骤) 3.6.4 触发Spring Boot启动过程的contextPrepared事件 3.6.5 添加两个Spring Boot中的特殊单例Beans - springApplicationArguments以及springBootBanner 3.6.6 加载sources - 对于DemoApplication而言,这里的sources集合只包含了它一个class对象 3.6.7 加载动作 - 构造BeanDefinitionLoader并完成Bean定义的加载 3.6.8 触发Spring Boot启动过程的contextLoaded事件 3.8 Spring上下文刷新 3.7.1 调用父类一系列的refresh操作来完成容器刷新的基础操作,涉及到了很多核心操作 3.7.2 注册一个关闭容器时的钩子函数,若没有提供自定义的shutdownHook,那么会生成一个默认的,并添加到Runtime中 3.9 Spring上下文(ApplicationContext)后置处理,所谓的后置操作,就是在容器完成刷新后,依次调用注册的Runners,Runners可以是两个接口的实现类:ApplicationRunner和CommandLineRunner 3.10 发出结束执行的事件,停止计时</code></pre> <h2>4.总结,Spring Boot启动时的两个关键步骤</h2> <pre><code>4.1 SpringApplication实例的构建过程,其中主要涉及到了初始化器(Initializer)以及监听器(Listener)这两大概念,它们都通过META-INF/spring.factories完成定义。 4.2 SpringApplication实例run方法的执行过程,其中主要有一个SpringApplicationRunListeners的概念,它作为Spring Boot容器初始化时各阶段事件的中转器,将事件派发给感兴趣的Listeners(在SpringApplication实例的构建过程中得到的)。 这些阶段性事件将容器的初始化过程给构造起来,提供了比较强大的可扩展性。 4.3 从可扩展性的角度出发,应用开发者可以在Spring Boot容器的启动阶段,扩展哪些内容呢: 4.3.1 初始化器(Initializer) 4.3.2 监听器(Listener) 4.3.3 Spring上下文后置处理Runners(ApplicationRunner或者CommandLineRunner接口的实现类) 4.3.4 启动期间在Console打印Banner的具体实现类</code></pre>

页面列表

ITEM_HTML