SpringBoot启动配置原理

 SpringApplication.run(SpringbootDay06Application.class, args);
 //先创建SpringApplication再运行run

1、创建SpringApplication对象

initialize(sources);
private void initialize(Object[] sources) {     
//保存主配置类     
	if (sources != null && sources.length > 0) {
	this.sources.addAll(Arrays.asList(sources));              			
	}     
//判断当前是否一个web应用(设置servlet环境)    
this.webEnvironment = deduceWebEnvironment();    
 //从类路径下找到META‐INF/spring.factories配置的所有ApplicationContextInitializer;然后保存起来(首次加载spring.factories文件)
 setInitializers((Collection) getSpringFactoriesInstances(
 ApplicationContextInitializer.class));     
 //从类路径下找到ETA‐INF/spring.factories配置的所ApplicationListener(第二次首次加载spring.factories文件)     
setListeners((Collection)getSpringFactoriesInstances(ApplicationListener.class));     
//从多个配置类中找到有main方法的主配置类     
this.mainApplicationClass = deduceMainApplicationClass(); 
}

deduceWebEnvironment()方法:主要是通过判断REACTIVE相关的字节码是否存在,如果不存在,则web环境即为SERVLET类型。这里设置好web环境类型,在后面会根据类型初始化对应环境。
ApplicationContextInitializer:是spring-context的一个接口,主要是spring ioc容器刷新之前的一个回调接口,用于处于自定义逻辑。
getSpringFactoriesInstances:这个方法是从META‐INF/spring.factories配置中相应的配置。
SpringApplication创建结束后
在这里插入图片描述
在这里插入图片描述
2、运行run方法

public ConfigurableApplicationContext run(String... args) {
		//时间监控
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		ConfigurableApplicationContext context = null;
		Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
		configureHeadlessProperty();
//获取SpringApplicationRunListeners;从类路径下META‐INF/spring.factories (getRunListeners有getSpringFactoriesInstances方法)
		//第一步:获取并启动监听器
		SpringApplicationRunListeners listeners = getRunListeners(args);
		//回调所有的获取SpringApplicationRunListener.starting()方法
		listeners.starting();
		try {
		//封装命令行参数
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(
					args);
			//第二步:构造容器环境(准备环境) 创建环境完成后回调SpringApplicationRunListener.environmentPrepared();表示环境准备完成 
			ConfigurableEnvironment environment = prepareEnvironment(listeners,
					applicationArguments);
			//设置需要忽略的bean
			configureIgnoreBeanInfo(environment);
			//打印banner
			Banner printedBanner = printBanner(environment);
			//第三步:创建容器(ioc);决定创建web的ioc还是普通的ioc 
			context = createApplicationContext();
			//第四步:实例化SpringBootExceptionReporter.class,用来支持报告关于启动的错误
			exceptionReporters = getSpringFactoriesInstances(
					SpringBootExceptionReporter.class,
					new Class[] { ConfigurableApplicationContext.class }, context);
		 //applyInitializers():回调之前保存的所有的ApplicationContextInitializer的initialize方法       
		  //回调所有的SpringApplicationRunListener的contextPrepared();
			//第五步:准备容器
			//prepareContext运行完成以后回调所有的SpringApplicationRunListener的contextLoaded(); 
			prepareContext(context, environment, listeners, applicationArguments,printedBanner);
			//第六步:刷新容器
			//ioc容器初始化(如果是web应用还会创建嵌入式的Tomcat);Spring注解版        
			//扫描,创建,加载所有组件的地方;(配置类,组件,自动配置) 
			refreshContext(context);
			//第七步:刷新容器后的扩展接口
			 //从ioc容器中获取所有的ApplicationRunner和CommandLineRunner进行回调        
			 //ApplicationRunner先回调,CommandLineRunner再回调 
			afterRefresh(context, applicationArguments);
			stopWatch.stop();
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass)
						.logStarted(getApplicationLog(), stopWatch);
			}
			listeners.started(context);
			callRunners(context, applicationArguments);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, exceptionReporters, listeners);
			throw new IllegalStateException(ex);
		}

		try {
			listeners.running(context);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, exceptionReporters, null);
			throw new IllegalStateException(ex);
		}
		//整个SpringBoot应用启动完成以后返回启动的ioc容器
		return context;
	}

SpringApplicationRunListeners类中有:starting()、 environmentPrepared(ConfigurableEnvironment environment) 、
contextPrepared(ConfigurableApplicationContext context)、contextLoaded(ConfigurableApplicationContext context)、
started(ConfigurableApplicationContext context)、
running(ConfigurableApplicationContext context)、
failed(ConfigurableApplicationContext context, Throwable exception)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值