-
SpringApplication对象实例初始化:
a.选择应用环境类型。判断上下文环境,如果是web环境,则创建StandardServletEnvironment对象,否则创建StandardEnvironment对象。后面会根据上下文环境进行针对性的设置。
执行SpringFactoriesLoader.loadFactoryNames方法,加载所有类路径下的META-INF/spring.factories文件中定义的全限定类名路径,包括maven中引入的spring-boot-starter相关jar包中。
获取所有(包括jar包)spring.factories文件中定义的全限定类名的值,放置到缓存集合中;
b.初始化ApplicationContextInitializer应用上下文初始化器。在缓存集合中,在classpath根目录下搜索ApplicationContextInitializer类路径名,通过Java反射方式,加载实例化对象。
c.初始化ApplicationListener监听器。在缓存集合中,在classpath根目录下搜索ApplicationListener类路径名,通过Java反射方式,加载实例化对象。
d.推断并设置main方法的定义类。进入运行阶段。
-
执行run方法:
a. 初始化SpringApplicationRunListener启动监听器。springApplication对象实例化后,首先通过SpringFactoriesLoader查找并加载SpringApplicationRunListener。打开监听器监听整个启动流程;
b. 加载应用环境Environment信息。将配置文件中的配置信息及main方法中传入的参数信息,加载到Environment(包括配置要使用的PropertySource以及Profile);
c. 初始并实例化ApplicationContext对象。默认是创建并使用非Web环境下为AnnotationConfigApplicationContext,基于注解的依赖注入;Web环境下为AnnotationConfigServletWebServerApplicationContext;Reactive Web环境下为AnnotationConfigReactiveWebServerApplicationContext。以上三个类构造器中,会构造一个AnnotationBeanDefinitionReader对象和ClassPathBeanDefinitionScanner对象,在构造AnnotationBeanDifinitionReader对象过程中会向bean factory添加注解处理器和事件监听处理器BeanDefinition,为后续的配置解析作准备。这样,就能通过JavaConfig构建BeanDefinition并实现自动扫描。
d. 设置Environment参数到ApplicationContext。将ResourceLoader和将Environment信息设置到ApplicationContext中。同时将起始类加载到ApplicationContext应用上下文中,这是Bean的加载工作的起点。同时将ApplicationContextInitializer应用到ApplicationContext中。
e. 刷新ApplicationContext。
1)初始化BeanFactory。获取Context的BeanFactory;
2)设置BeanFactory属性和注册相关Bean。比如:给BeanFactory设置ClassLoader,SpEL解析器,添加BeanPostProcessor;注册Environment相关的Bean到BeanFactory中
3)创建并初始化相关的对象,并注册到容器中。比如BeanPostProcessor, MessageSource等。
4)结束BeanFactory初始化。实例化所有定义为非懒加载的Bean到容器中,并发送结束事件到所有Listener监听器。
d. 调用执行ApplicationContext中的ApplicationRunner和CommandLineRunner的run方法。实现该接口,主要是用于实现在容器启动成功后,去执行一段代码逻辑,这段初始化代码在整个应用生命周期内只会执行一次。可利用@Order注解(或实现Order接口)来规定所有的CommandLineRunner实例的运行顺序,value值越小,优先级越高。
e. 异常处理。异常时,发送了ApplicationReadyEvent或ApplicationFailedEvent到所有Listener监听器。