20°

springboot

SpringApplication.run分析

一是SpringApplication实例化,二是run方法的执行

SpringApplication实例化

1、推断应用类型是Standard还是Web

2、查找并加载所有可用初始化器,设置到initializers属性中

3、找出所有的应用程序监听器,设置到listeners属性中

4、推断并设置main方法的定义类,意思就是找出运行的主类

请打开SpringApplication类 找到ConfigurableApplicationContext方法(请结合源码查看) 大致有14步: `public ConfigurableApplicationContext run(String... args) { //计时工具 StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; CollectionexceptionReporters = new ArrayList<>();

	// 1设置java.awt.headless系统属性为true
	configureHeadlessProperty();
//2初始化监听器 -- SpringBoot的自动装配资源,然后获取到后存放到list中创建了SpringFactories的实例
SpringApplicationRunListeners listeners = getRunListeners(args);


//3启动已准备好的监听器,发布应用启动事件
listeners.starting();
try {

	//4 根据SpringApplicationRunListeners以及参数来装配环境
	ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
	ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
	configureIgnoreBeanInfo(environment);


	//5  打印Banner
	Banner printedBanner = printBanner(environment);


	//6创建Spring ApplicationContext()上下文  --根据不同的webApplicationType的类型,来创建不同的ApplicationContext
	context = createApplicationContext();


	//7 准备异常报告器
	exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
			new Class[] { ConfigurableApplicationContext.class }, context);


	//8 装配Context,上下文前置处理
	prepareContext(context, environment, listeners, applicationArguments, printedBanner);

	//9 刷新上下文
	refreshContext(context);


	//10 Spring上下文后置结束处理
	afterRefresh(context, applicationArguments);

	//停止计时
	stopWatch.stop();
	if (this.logStartupInfo) {
		new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
	}

	//11  发布应用上下文启动完成事件
	listeners.started(context);

	//12 执行所有 Runner 运行器
	callRunners(context, applicationArguments);
}
catch (Throwable ex) {
	handleRunFailure(context, ex, exceptionReporters, listeners);
	throw new IllegalStateException(ex);
}

try {
	//13 发布应用上下文就绪事件
	listeners.running(context);
}
catch (Throwable ex) {
	handleRunFailure(context, ex, exceptionReporters, null);
	throw new IllegalStateException(ex);
}

//14 返回应用上下文
return context;

}

`springboot自动配置原理主要有两种方式:

1.@EnableXXX

比如@EnableCaching 当你依赖某个starter时,可以选择是否开启starter中帮你自动配置的一些设置.这个@EnableXXX从单词上看,就知道有开关的意思

2.META-INF/spring.factories这种的好处是,当你依赖某个starter时,自动帮你开启starter中帮你自动配置的一些设置

最主要的关键字 ImportSelector主要的作用就是能够在代码运行中配置创建bean

自动配置原理总结

1.启动main函数,加载@SpringBootApplication

2.@SpringBootApplication会拿到META-INF/spring.factories中需要自动配置的类的全名

3.把自动配置的类全名放入ImportSelector中,从而创建了自动配置类,根据自动配置类中的逻辑,进行相应的自动配置

本文由【BIG_BRA】发布于开源中国,原文链接:https://my.oschina.net/Pirvate/blog/3159750

全部评论: 0

    我有话说: