Spring boot启动流程

            Spring Boot的代码main方法启动为例子分析

        SpringApplication.run方法java

public static ConfigurableApplicationContext run(Object source, String... args) {
		return run(new Object[] { source }, args);
	}

public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
		return new SpringApplication(sources).run(args);
	}

 

进而可知又从新建立了个一个SpringApplication类后,执行run方法web

在建立SpringApplication这个类时候的用到了initialize方法spring

 

private void initialize(Object[] sources) {
//判断传入的参数,有就做为数组保存起来
		if (sources != null && sources.length > 0) {
			this.sources.addAll(Arrays.asList(sources));
		}
//测试是不是web环境
		this.webEnvironment = deduceWebEnvironment();
//初始化spring.factories文件中对应的ApplicationContextInitializer实现类(四个)
		setInitializers((Collection) getSpringFactoriesInstances(
				ApplicationContextInitializer.class));
//初始化spring.factories文件中对应的ApplicationListener实现类(九个)
		setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
//经过当前堆栈找到入口main函数所在的类
		this.mainApplicationClass = deduceMainApplicationClass();
	}

 而后运行新对象的run方法数组

public ConfigurableApplicationContext run(String... args) {
//启动监视器,记录启动的时间等信息
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		ConfigurableApplicationContext context = null;
		FailureAnalyzers analyzers = null;

//用来设置java.awt.headless 属性是true 仍是false, java.awt.headless是J2SE的一种模式用于在缺乏显示屏、键盘或者鼠标时的系统配置,不少监控工具如jconsole 须要将该值设置为true

		configureHeadlessProperty();
//根据spring.factories文件获取到SpringApplicationRunListeners 的实现类名org.springframework.boot.context.event.EventPublishingRunListener
实例化,他就是一个事件发布者,内部持有一个EventPublishingRunListener,真正发布是这个类
		SpringApplicationRunListeners listeners = getRunListeners(args);
//发布启动事件给各个监听器
		listeners.starting();
		try {
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(
					args);
			ConfigurableEnvironment environment = prepareEnvironment(listeners,
					applicationArguments);
			Banner printedBanner = printBanner(environment);
			context = createApplicationContext();
			analyzers = new FailureAnalyzers(context);
			prepareContext(context, environment, listeners, applicationArguments,
					printedBanner);
			refreshContext(context);
			afterRefresh(context, applicationArguments);
			listeners.finished(context, null);
			stopWatch.stop();
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass)
						.logStarted(getApplicationLog(), stopWatch);
			}
			return context;
		}
		catch (Throwable ex) {
			handleRunFailure(context, listeners, analyzers, ex);
			throw new IllegalStateException(ex);
		}
	}
相关文章
相关标签/搜索