@EnableDiscoveryClient
@SpringBootApplication
public class ProducerApplication {
    public static void main(String[] args) {
    SpringApplication application = new SpringApplication(Application.class);
    //application.setDefaultProperties(Properties properties); 可以设置参数
    ConfigurableApplicationContext context = application.run(args);
   }
 }
 
 
1.创建SpringApplication对象,传入资源问题
    1.1 initialize()初始化容器资源
         1.1.1 将配置资源文件设置个 List<Object> sources对象。
         1.1.2 判断当前是否web环境, 根据查询当前环境中有没有"javax.servlet.Servlet",  "org.springframework.web.context.ConfigurableWebApplicationContext" 字节码文件做判断。
         1.1.3 从META-INF/spring.factories配置文件中加载 ApplicationContextInitializer类,并创建对象,返回对象List赋值给SpringApplication的initializers属性
         1.1.4 从META-INF/spring.factories配置文件中加载 ApplicationListener类,并创建对象, 返回listenter对象的List赋值给SpringApplication的listeners属性。
         1.1.5 判断启动类。    
         (此时可以通过SpringApplication对象设置系统配置, sa.setDefaultProperties(Properties defaultProperties))
    
2.执行sa.run(args)函数
     2.1 通过configureHeadlessProperty()方法设置"java.awt.headless"属性,先从系统设置中获取,如果取到则不做处理,如果没取到,则设置true进去。
    
    2.2 从META-INF/spring.factories配置文件中加载 SpringApplicationRunListener类,并创建对象, 将listenter对象的List对象作为参数创建
         SpringApplicationRunListeners(listeners)对象实例,并返回。
         
         SpringApplicationRunListener {
             void starting();
             void environmentPrepared(ConfigurableEnvironment environment);
             void contextPrepared(ConfigurableApplicationContext context);
             void contextLoaded(ConfigurableApplicationContext context);
             void finished(ConfigurableApplicationContext context, Throwable exception);
          }
         
    2.3 listeners.starting() 执行所有SpringApplicationRunListener的starting()方法。
    
    2.4 设置应用参数。
         ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    
    2.5 准备配置环境。
          ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);
       2.5.1 获取或创建配置环境
         ConfigurableEnvironment environment = getOrCreateEnvironment();
         (1) 如果environment对象已经存在,则直接返回
         (2) 如果不存在,判断webEnvironment(web环境)为true则创建 StandardServletEnvironment对象并返回该对象,否则创建 StandardEnvironment对象并返回。
       2.5.2 设置系统配置参数
         (1) 设置系统资源问题:configurePropertySources(environment, args);
         (2) 获取激活配置文件:configureProfiles(environment, args);
       2.5.3 执行 SpringApplicationRunListeners listeners.environmentPrepared(environment)方法
         (1) 即执行所有SpringApplicationRunListener listener的environmentPrepared()方法。
       2.5.4 如果当前环境非web环境,则对environment进行一次包装。
    
    2.6 设置打印banner
         Banner printedBanner = printBanner(environment);
         
    2.7 判断需要创建的容器类型,并创建context = createApplicationContext();
         2.7.1 判断需要的容器类型
             contextClass = Class.forName(this.webEnvironment ? DEFAULT_WEB_CONTEXT_CLASS : DEFAULT_CONTEXT_CLASS);
         
         2.7.2 使用反射创建容器并返回
             (ConfigurableApplicationContext) BeanUtils.instantiate(contextClass);
    
    2.8 加载失败解析器
         2.8.1 到classpath中 META-INF/spring.factories文件获取 , 并加载类文件并创建实例对象,返回 List<FailureAnalyzer> analyzers;
             loadFailureAnalyzers(this.classLoader);
         
         2.8.2 准失败分析器, 如何分析器实现了BeanFactoryAware接口,则执行setBeanFactory操作。
             (1) prepareFailureAnalyzers.prepareFailureAnalyzers(this.analyzers, context);
             (2) ((BeanFactoryAware) analyzer).setBeanFactory(context.getBeanFactory());
    
    2.9 准备容器
         prepareContext(context, environment, listeners, applicationArguments, printedBanner);
         2.9.1 设置容器环境变量
              context.setEnvironment(environment);
             
         2.9.2 设置容器中BeanName解析器,资源加载器
              postProcessApplicationContext(context);
             
         2.9.3 执行ApplicationContextInitializer中的initialize(context)方法    
              applyInitializers(context);
                 initializer.initialize(context);
                 
         2.9.4 执行SpringApplicationRunListener的 contextPrepared(context)方法
              listeners.contextPrepared(context);
             
         2.9.5 向容器设置springApplicationArguments对象实例。
              context.getBeanFactory().registerSingleton("springApplicationArguments",applicationArguments);
             
         2.9.6 向容器设置banner
              context.getBeanFactory().registerSingleton("springBootBanner", printedBanner);
             
         2.9.7 设置beanDefination加载器beanDefinationLoader,并解析加载创建bean对象到容器
             load(context, sources.toArray(new Object[sources.size()]));
             
         2.9.8  执行SpringApplicationRunListener的 contextLoaded(context)方法
              listeners.contextLoaded(context);
 
       2.9.9 刷新容器(后续专门解析)
             refreshContext(context);
     包括加载Beandefination, Beanfactorypostprocess,Beanpostprocess,实现相关接口方法的执行,bean的实例化, bean对象的包装等操作。返回即为装满应用对象的beanFactory.
             
         2.9.10 容器加载启动完成,执行runner接口的实现类。
             afterRefresh(context, applicationArguments);
                  callRunners(context, args);
         
         2.9.11 执行SpringApplicationRunListener的 finished(context)方法
              listeners.finished(context);
             
         完成,返回容器。   
												
												
						- SpringBoot启动流程解析
		
写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...
		 
						- SpringBoot启动流程分析(五):SpringBoot自动装配原理实现
		
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
		 
						- SpringBoot启动流程分析(六):IoC容器依赖注入
		
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
		 
						- SpringBoot启动流程分析(一):SpringApplication类初始化过程
		
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
		 
						- SpringBoot启动流程分析(二):SpringApplication的run方法
		
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
		 
						- SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法
		
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
		 
						- SpringBoot启动流程分析(四):IoC容器的初始化过程
		
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
		 
						- SpringBoot启动流程及其原理
		
Spring Boot.Spring MVC 和 Spring 有什么区别? 分别描述各自的特征: Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等:但他们的 ...
		 
						- springboot启动流程(一)构造SpringApplication实例对象
		
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 启动入口 本文是springboot启动流程的第一篇,涉及的内容是SpringApplicat ...
		 
						- SpringBoot 启动流程
		
SpringBoot 启动流程 加载 resources/META-INF/spring.factories 中配置的 ApplicationContextInitializer 和 Applicat ...
		 
		
	
随机推荐
	
									- 02-Django框架介绍
			
02-Django框架介绍 1.MVC框架介绍 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式 具有耦合性低.重用性高.生 ...
			 
						- Docker 核心技术之网络管理
			
为什么需要Docker网络管理 容器的网络默认与宿主机.与其他容器都是相互隔离. 容器中可以运行一些网络应用(如nginx.web应用.数据库等),如果要让外部也可以访问这些容器内运行的网络应用,那么 ...
			 
						- 解决android studio引用远程仓库下载慢(JCenter下载慢)
			
使用开源中国的maven库 阿里云的(速度飞快):http://maven.aliyun.com/nexus/content/groups/public/ 替换项目根目录下build.gradle中的 ...
			 
						- SQL进阶随笔--case用法(二)
			
---恢复内容开始--- 用 CHECK 约束定义多个列的条件关系 今天来说下check和case的用法.其实,CASE 表达式和 CHECK 约束是很般配的一对组合.也许有很多数据库工程师不怎么用  ...
			 
						- ElementUI DatePicker 日期选择器控制选择时间范围
			
选择今天以及今天之后的日期 <el-date-picker v-model="value1" type="date" placeholder=" ...
			 
						- pixy&STM32使用记录(串口&SPI外设)
			
先踏踏实实的把stm32的外设串口,SPI搞清楚,不要眼高手低,看不起小事.用SPI通信将pixy的数据读出来,将数据用串口发到串口助手上,然后处理数据,利用STM32的定时器调节pwm,控制电机,先 ...
			 
						- Django启动时报错Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试
			
1.系统环境配置 window 10 + python 3.6 + django 1.11.20 2.报错原因 原因:可以肯定是端口被占用了,但是我只开了一个django,那究竟是哪款软的骚操作占用我 ...
			 
						- 堆以及一些用法 QWQ这是写得最认真的板子题
			
最近一直在学图论,然后吧,由于学的东西实在是太多太杂了,加上蒟蒻本蒻又经常颓,所以落了好多好多板子题的整理没写啊嘤嘤嘤,不过把这些东西学的差不多了,再一块写个整理,其实感觉还不错?????也算是很神奇 ...
			 
						- python之路day09--函数
			
s='金老板啊'print(len(s)) #内置函数 s='金老板啊'# def my_len():# i=0# for k in s:# i+=1# # print(i)# print(my_le ...
			 
						- ScrollView & HorizontalScrollView
			
可垂直或水平滚动的列表 ScrollView & HorizontalScrollView内部只能有一个直接的子元素, <?xml version="1.0" enc ...