springboot启动过程图解,SpringBoot启动流程

首页 > 机动车 > 作者:YD1662023-11-09 18:32:06

4:准备上下文 this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) { // 把environment设置到上下文里面 context.setEnvironment(environment); this.postProcessApplicationContext(context); // 调用初始化的方法 this.applyInitializers(context); // 发布一个ApplicationContextInitializedEvent 事件 listeners.contextPrepared(context); if (this.logStartupInfo) { this.logStartupInfo(context.getParent() == null); this.logStartupProfileInfo(context); } ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); beanFactory.registerSingleton("springApplicationArguments", applicationArguments); if (printedBanner != null) { beanFactory.registerSingleton("springBootBanner", printedBanner); } if (beanFactory instanceof DefaultListableBeanFactory) { ((DefaultListableBeanFactory)beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding); } if (this.lazyInitialization) { context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor()); } Set<Object> sources = this.getAllSources(); Assert.notEmpty(sources, "Sources must not be empty"); this.load(context, sources.toArray(new Object[0])); // 发布一个准备完成的事件, 在这一步 会把springboot 中的监听器都放入到spring容器context中 listeners.contextLoaded(context); }

this.applyInitializers(context);

protected void applyInitializers(ConfigurableApplicationContext context) { // 这里获取调用的就是 SpringApplication构造函数执行时 加载的spring.factoies中 ApplicationContextInitializer for (ApplicationContextInitializer initializer : getInitializers()) { Class<?> requiredType = GenericTypeResolver.resolveTypeArgument(initializer.getClass(), ApplicationContextInitializer.class); Assert.isInstanceOf(requiredType, context, "Unable to call initializer."); initializer.initialize(context); } }

注意一点,如果是我们自定义的监听器,如果是监听的这些启动过程中的事件,需要把监听器放到spring.factories中或者yml文件中才会生效,如果是@Component放到spring 容器中是不会生效的,因为到这里spring容器还没创建好。

这一步把springboot中的监听器都加入到spring容器中,在这一步之后,springboot中的监听器就能监听spring容器中的事件了。

但是spring中的监听器监听不到springboot中的事件。

public void contextLoaded(ConfigurableApplicationContext context) { for (ApplicationListener<?> listener : this.application.getListeners()) { if (listener instanceof ApplicationContextAware) { ((ApplicationContextAware) listener).setApplicationContext(context); } context.addApplicationListener(listener); } this.initialMulticaster.multicastEvent(new ApplicationPreparedEvent(this.application, this.args, context)); }

5:刷新上下文 refreshContext(context);

6: afterRefresh(context, applicationArguments); 这是一个空方法,可以用于扩展,重写这个方法。

7: listeners.started(context); springboot启动后的事件,这个还没有对应的监听器,可以用于扩展,实现一个监听器监听这个事件做处理。

public void started(ConfigurableApplicationContext context) { context.publishEvent(new ApplicationStartedEvent(this.application, this.args, context)); AvailabilityChangeEvent.publish(context, LivenessState.CORRECT); }

8: listeners.running(context); 也是可以扩展的

public void running(ConfigurableApplicationContext context) { context.publishEvent(new ApplicationReadyEvent(this.application, this.args, context)); AvailabilityChangeEvent.publish(context, ReadinessState.ACCEPTING_TRAFFIC); }


通过上面的流程,可以知道,springboot中事件发布器就是 EventPublishingRunListener,它里面定义了一系列事件发布的方法。然后靠 spring中的SimpleApplicationEventMulticaster 发布事件。

ationContext context) { for (ApplicationListener<?> listener : this.application.getListeners()) { if (listener instanceof ApplicationContextAware) { ((ApplicationContextAware) listener).setApplicationContext(context); } context.addApplicationListener(listener); } this.initialMulticaster.multicastEvent(new ApplicationPreparedEvent(this.application, this.args, context)); }

5:刷新上下文 refreshContext(context);

6: afterRefresh(context, applicationArguments); 这是一个空方法,可以用于扩展,重写这个方法。

7: listeners.started(context); springboot启动后的事件,这个还没有对应的监听器,可以用于扩展,实现一个监听器监听这个事件做处理。

public void started(ConfigurableApplicationContext context) { context.publishEvent(new ApplicationStartedEvent(this.application, this.args, context)); AvailabilityChangeEvent.publish(context, LivenessState.CORRECT); }

8: listeners.running(context); 也是可以扩展的

public void running(ConfigurableApplicationContext context) { context.publishEvent(new ApplicationReadyEvent(this.application, this.args, context)); AvailabilityChangeEvent.publish(context, ReadinessState.ACCEPTING_TRAFFIC); }


通过上面的流程,可以知道,springboot中事件发布器就是 EventPublishingRunListener,它里面定义了一系列事件发布的方法。然后靠 spring中的SimpleApplicationEventMulticaster 发布事件。

上一页1234末页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.