启动配置原理
几个重要的事件回调机制
- ApplicationContextInitializer
- SpringApplicationRunListener
- ApplicationRunner
- CommandLineRunner
启动流程
1 | return new SpringApplication(primarySources).run(args); |
- 创建SpringApplication对象
- 运行run方法
创建对象
现在左边的参数是null
1 | public SpringApplication(Class<?>... primarySources) { |
第8行
判断这是哪一类web应用,web分三类
1 | public enum WebApplicationType { |
1 | static WebApplicationType deduceFromClasspath() { |
第9行
从类路径下找到所有的spring.factories配置的所有ApplicationConterxtInitializeer,然后保存
1 | private static Map<String, List<String>> loadSpringFactories( { ClassLoader classLoader) |
1 | public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories"; |
第10行
找listener
第11行
找到主配置类
1 | private Class<?> deduceMainApplicationClass() { |
run
1 | /** |
第12行
配置awt
第13-14行
获取listener, 然后回调所有的listener
1 | void starting() { |
第17行
准备环境, 获取环境,这里的getOrCreateEnvironment分三种,点进去就知道了, 获取后配置环境,之后回调listeners的环境准备完成函数listeners.environmentPrepared(environment);
1 | private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners, |
第19行
打印图标
第20行
利用反射,根据当前的web环境创建IOC容器,
1 | /** |
第23行
准备上下文环境, 在环境保存到ioc中,而且applyInitializers, 即回调之前保存的所有的initializer, 然后监听器调用环境准备完毕,之后就是打印日志、在IOC中注册Banner、命令行参数。最后回调监听器的环境加载完成
1 | private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment, |
第24行
这里之前讲过,是加载IOC容器中的所有组件的,如果是web应用,还会创建嵌入式的tomcat
第31行
1 | 回调所有的runner,里面包含了APplicationRunner和CommandLineRunner, 优先调用前者 |
run结束了
返回IOC容器
- 本文作者: fightinggg
- 本文链接: http://fightinggg.github.io/yilia/yilia/Q9I38V.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!