initializers 
— {ContextIdAppIicationContextInitiaUizer@28S7h 
— {ConfigurationV'arningsAppIicationContextInitiaIizer@2ES8h 
— {ServerPortInfoAppIicationContextInitiaIizer@286G]} 
{ConditionEvaUuationReportLoggingListener@2e61}
ApplicationContextInitializer
listeners 
rayList@213 
- {EnvironmentPostProcessorApplicationListenep@2137} 
1 {Ansi0utputApplicationListener@2138Y 
2 = {LoggingApplicationListener@2139} 
- {BackgroundPreinitializer@214ß} 
4 = {DelegatingApplicationListener@2141Y 
- {ParentContextCIoserApplicationListener@2142Y 
{ClearCachesAppIicationListener@214S} 
= {LiquibaseServiceLocatorAppIicationListener@2145}
ApplicationListener
Spring容器启动流程
	Ⅰ几个重要的事件回调机制
		配置在META-INF/spring.factories中
			ApplicationContextInitializer————(应用初始化器)
			SpringApplicationRunListener————(Spring应用运行监听器)
		放置在IOC容器中
			ApplicationRunner————(应用运行器)
			CommandLineRunner————(命令行运行器)
	Ⅱ简述流程:
		SpringApplication.run(BootStartAndRunApplication.class, args);
		
		
			//《一、创建Spring应用对象》————找到并保存初始化器和监听器。
			1、new SpringApplication(primarySources);
				//判断当前的web应用的类型 ———— SERVLET
				1)this.webApplicationType = WebApplicationType.deduceFromClasspath();
				
				
				//从类路径下的META-INF/spring.factories配置中找到所有的ApplicationContextInitializer,保存起来。
				2)this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
				
					
				
				//从类路径下的META-INF/spring.factories配置中找到所有的ApplicationListener,保存起来。
				3)this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
				
								
				
				//从多个配置类中找到有main方法的主配置类(@SpringBootApplication标注的主程序类、主入口类)
				4)this.mainApplicationClass = this.deduceMainApplicationClass();
				
				
			//《二、调用对象的run方法》
			2、SpringApplication.run(args);
			
				//创建一个默认的 引导用的上下文(一个容器)
				1)DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
				
				
				//获取之前保存起来的所有SpringApplicationRunListener
				2)SpringApplicationRunListeners listeners = this.getRunListeners(args);
				
				
				//回调所有SpringApplicationRunListener的starting方法(传参:默认的引导上下文、主配置类)
				3)listeners.starting(bootstrapContext, this.mainApplicationClass);
				
				
				//封装命令行参数
				4)ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
				
				
				//准备环境
				5)ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
					//创建环境
					· ConfigurableEnvironment environment = this.getOrCreateEnvironment();
					//SpringApplicationRunListener回调函数:environmentPrepared,表示环境准备完成
					· listeners.environmentPrepared(bootstrapContext, (ConfigurableEnvironment)environment);
					//将准备好的环境返回
					· return (ConfigurableEnvironment)environment;
					
					
				//console 打印springboot banner图标
				6)Banner printedBanner = this.printBanner(environment);
				
				
				//根据容器类型创建IOC容器
				7)context = this.createApplicationContext();
				
				
				//开始准备容器。
				//(引导用的上下文、上一步刚创建好的IOC容器、第⑤步准备的环境、listeners、命令行参数、banner)
				8)this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
					//将准备好的环境保存到IOC容器中
					· context.setEnvironment(environment);
					//保存完环境,后处理IOC容器
					· this.postProcessApplicationContext(context);
					//初始化容器
					· this.applyInitializers(context);
						//回调步骤:1)、②保存好的ApplicationContextInitializer的initialize方法。(初始化容器)
						initializer.initialize(context);
					//SpringApplicationRunListener监听到容器准备好了。
					· listeners.contextPrepared(context);
					//环境准备完成,回调所有SpringApplicationRunListeners的contextLoaded完成容器装载。
					· listeners.contextLoaded(context);
					
					
				//刷新容器,IOC容器初始化
				//(扫描、创建、加载所有组件的地方,如:配置类,组件,自动配置)
				9)this.refreshContext(context);
								public abstract class AbstractApplicationContext
									public void refresh()
										this.finishBeanFactoryInitialization(beanFactory);
										
										
				//SpringApplicationRunListener监听到容器已启动。
				10)listeners.started(context);
				
				
				11)this.callRunners(context, applicationArguments);
					//从IOC容器获取所有的ApplicationRunner、CommandLineRunner再进行回调。
					runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
					runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
					//先回调ApplicationRunner,再回调CommandLineRunner。
						this.callRunner((ApplicationRunner)runner, args);
						this.callRunner((CommandLineRunner)runner, args);
					
					
				//最后,将创建好的IOC容器返回。至此,spring应用已成功启动。
				12)return context;
分类: Spring Boot

Deng Jia

Keep Moving.

0 条评论

发表评论

电子邮件地址不会被公开。