SpringBoot启动应用及回调监听原理解析

网友投稿 246 2023-05-24

SpringBoot启动应用及回调监听原理解析

这篇文章主要介绍了SpringBoot启动应用及回调监听原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

主类Main方法

public static void main(String[] args) {

SpringApplication.run(SpringBootRunApplication.class, args);

}

创建SpringApplication对象

public static ConfigurableApplicationContext run(Class>[] primarySources, String[] args) {

return (new SpringApplication(primarySources)).run(args);

}

构造器

public SpringApplication(ResourceLoader resourceLoader, Class>... primarySources) {

this.sources = new LinkedHashSet();

this.bannerMode = Mode.CONSOLE;

this.logStartupInfo = true;

this.addCommandLineProperties = true;

this.addConversionService = true;

this.headless = true;

this.registerShutdownHook = true;

this.additionalProfiles = new HashSet();

this.isCustomEnvironment = false;

this.lazyInitialization = false;

this.resourceLoader = resourceLoader;

Assert.notNull(primarySources, "PrimarySources must not be null");

this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));

this.webApplicationType = WebApplicationType.deduceFromClasspath();

this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));

this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));

this.mainApplicationClass = this.deduceMainApplicationClass();

}

ApplicationContextInitializer&ApplicationListener

读取META-INF/spring.factories文件中的类

this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));

this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));

执行run方法

public ConfigurableApplicationContext run(String... args) {

StopWatch stopWatch = new StopWatch();

stopWatch.start();

// IOC容器

ConfigurableApplicationContext context = null;

Collection exceptionReporters = new ArrayList();

this.configureHeadlessProperty();

// 读取META-INF/spring.factories文件获得SpringApplicationRunListener的实现类集合

SpringApplicationRunListeners listeners = this.getRunListeners(args);

// 监听开始,回调所有SpringApplicationRunListener的starting()方法

listeners.starting();

Collection exceptionReporters;

try {

ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);

// 监听配置环境准备好了,回调所有SpringApplicationRunListener的environmentPrepared()方法

ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);

this.configureIgnoreBeanInfo(environment);

Banner printedBanner = this.printBanner(environment);

// 创建IOC容器

context = this.createApplicationContext();

exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);

// 回调ApplicationContextInitializer的initialize()方法,回调SpringApplicationRunListener的contextPrepared()方法

// 回调SpringApplicationRunListener的contextLoaded()方法

this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

// 刷新IOC容器,注入组件

this.refreshContext(context);

this.afterRefresh(context, applicationArguments);

stopWatch.stop();

if (this.logStartupInfo) {

(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);

}

// 回调SpringApplicationRunListener的started()方法

listeners.started(context);

// 从IOC容器中获得ApplicationRunner、CommandLineRunner的所有组件,回调ApplicationRunner、CommandLineRunner的run()方法

this.callRunners(context, applicationArguments);

} catch (Throwable var10) {

this.handleRunFailure(context, var10, exceptionReporters, listeners);

throw new IllegalStateException(var10);

}

try {

// 回调SpringApplicationRunListener的running()方法

listeners.running(context);

return context;

} catch (Throwable var9) {

this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);

throw new IllegalStateExcepthttp://ion(var9);

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java实现对对碰小游戏
下一篇:Java中Gson的使用详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~