您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: