011-Spring Boot 运行流程分析
2018-01-28 10:48
253 查看
一、程序入口
1.1、静态方法
//直接调用run方法 ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
内部实现:
public static ConfigurableApplicationContext run(Object source, String... args) { return run(new Object[] { source }, args); }
查看run
public static ConfigurableApplicationContext run(Object[] sources, String[] args) { return new SpringApplication(sources).run(args); }
故等效于实例化,后调用。同1.2
1.2、实例化SpringApplication,调用run方法
//实例化SpringApplication然后调用run方法 SpringApplication application = new SpringApplication(App.class); ConfigurableApplicationContext context = application.run(args);
查看实现
public SpringApplication(Object... sources) { initialize(sources); }
查看initialize
@SuppressWarnings({ "unchecked", "rawtypes" }) private void initialize(Object[] sources) { if (sources != null && sources.length > 0) { this.sources.addAll(Arrays.asList(sources)); } this.webEnvironment = deduceWebEnvironment(); setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class)); setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); this.mainApplicationClass = deduceMainApplicationClass(); }
二、运行流程分析
2.1、【new SpringApplication(App.class);初始化】
1、将source添加到set:中:this.sources.addAll(Arrays.asList(sources));2、判断是不是web环境this.webEnvironment = deduceWebEnvironment();
protected void afterRefresh(ConfigurableApplicationContext context, ApplicationArguments args) { callRunners(context, args); } private void callRunners(ApplicationContext context, ApplicationArguments args) { List<Object> runners = new ArrayList<Object>(); runners.addAll(context.getBeansOfType(ApplicationRunner.class).values()); runners.addAll(context.getBeansOfType(CommandLineRunner.class).values()); AnnotationAwareOrderComparator.sort(runners); for (Object runner : new LinkedHashSet<Object>(runners)) { if (runner instanceof ApplicationRunner) { callRunner((ApplicationRunner) runner, args); } if (runner instanceof CommandLineRunner) { callRunner((CommandLineRunner) runner, args); } } } private void callRunner(ApplicationRunner runner, ApplicationArguments args) { try { (runner).run(args); } catch (Exception ex) { throw new IllegalStateException("Failed to execute ApplicationRunner", ex); } } private void callRunner(CommandLineRunner runner, ApplicationArguments args) { try { (runner).run(args.getSourceArgs()); } catch (Exception ex) { throw new IllegalStateException("Failed to execute CommandLineRunner", ex); } }
View Code
16、执行所有SpringApplicationRunListeners的finished方法:listeners.finished(context, null);;
17、结束,如果出现问题将使用日志handleRunFailure
相关文章推荐
- Apache Shiro的运行流程和权限控制方式分析
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之BPServiceActor工作线程运行流程(下)
- 分析Python的Django框架的运行方式及处理流程
- WordCount程序运行流程分析
- Struts2运行流程分析
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之BPServiceActor工作线程运行流程(上)
- 27. Struts2运行流程分析
- 深度分析gevent运行流程
- [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
- 22.struts2_运行流程分析
- Java8流Stream中间操作、终止操作运行流程源码分析
- Monkey源码分析之运行流程
- Hadoop运行流程分析
- spark源码分析:spark运行总流程
- Struts2运行流程分析
- springMVC运行流程分析
- 分析cocos2dx 3.3运行流程
- Monkey源码分析之运行流程
- Spark源码分析之Job提交运行总流程概述
- Struts2源码分析(二)Struts2运行流程分析