• Spring Boot启动流程


    一、一行代码完成启动

    @SpringBootApplication
    public class Sb2Application {
    
    	public static void main(String[] args) {
    		SpringApplication.run(Sb2Application.class, args);
    	}
    
    }
    

      

    进入SpringApplication的run方法

    SpringApplication.run(Sb2Application.class, args);

    分为两步: 一步是初始化SpringApplication, new SpringApplication,第二步是调用SpringApplication的run方法

    第一步:初始化SpringApplication

     public SpringApplication(Class... primarySources) {
            this((ResourceLoader)null, primarySources);
        }
    
        public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
            this.sources = new LinkedHashSet();
            this.bannerMode = Mode.CONSOLE;
            this.logStartupInfo = true;
            this.addCommandLineProperties = true;
            this.addConversionService = true;
            this.headless = true;
            this.registerShutdownHook = true;
            this.additionalProfiles = new HashSet();
            this.isCustomEnvironment = false;
            this.lazyInitialization = false;
            this.resourceLoader = resourceLoader;
            Assert.notNull(primarySources, "PrimarySources must not be null");
            this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
            this.webApplicationType = WebApplicationType.deduceFromClasspath();
            this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
            this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
            this.mainApplicationClass = this.deduceMainApplicationClass();
        }
    

      

    第二步 调用SpringApplication的run方法

    /**
    	 * Run the Spring application, creating and refreshing a new
    	 * {@link ApplicationContext}.
    	 * @param args the application arguments (usually passed from a Java main method)
    	 * @return a running {@link ApplicationContext}
    	 */
    	public ConfigurableApplicationContext run(String... args) {
    		StopWatch stopWatch = new StopWatch();
    		stopWatch.start();
    		ConfigurableApplicationContext context = null;
    		Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
    		configureHeadlessProperty();
    		SpringApplicationRunListeners listeners = getRunListeners(args);
    		listeners.starting();
    		try {
    			ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    			ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
    			configureIgnoreBeanInfo(environment);
    			Banner printedBanner = printBanner(environment);
    			context = createApplicationContext();
    			exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
    					new Class[] { ConfigurableApplicationContext.class }, context);
    			prepareContext(context, environment, listeners, applicationArguments, printedBanner);
    			refreshContext(context);
    			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);
    		}
    		return context;
    	}
    

     

    二、启动流程

    1、框架初始化

    2、框架启动

    3、自动化装配

     

    1、框架初始化步骤

    框架初始化步骤:

    配置资源加载器

    配置primarySources

    应用环境检测

    配置系统初始化器

    配置应用监听器

    配置main方法所在的类

    2、框架启动流程

    计时器开始计时 -> Headless模式赋值 ->  发送ApplicationStartEvent

    -> 配置环境模块 -> 发送ApplicationEnvironmentPreparedEvent

    -> 打印banner(打印出来的Spring 1.X 或者Spring 2.X条幅)

    -> 创建应用上下文对象 -> 初始化失败分析器

    -> 关联springboot组件与应用上下文对象 -> 发送ApplicationContextInitializedEvent

    -> 加载source到context -> 发送ApplicationPreparedEvent

    -> 刷新上下文(调用Spring框架的DoRefresh方法)

    ->计时器停止计时 -> 发送ApplicationStartedEvent

    -> 调用框架启动扩展类 -> 发送ApplicationReadyEvent

    3、自动化装配

    收集配置文件中的配置工厂类

    加载组件工厂

    注册组件内定义bean

    Spring Boot的完整流程图

  • 相关阅读:
    linux环境下Redis主从复制和集群环境搭建
    2017年秋季学期软件工程第二次作业
    《人月神话》读后感
    功能需求描述
    初学Windows应用程序开发遇到的几个专业名词解释
    2017年秋季学期软件工程第一次作业(曹洪茹)
    第二次四则运算完善
    《人月神话》读后感
    软件工程课上随笔-规约
    2017软件工程第三次作业
  • 原文地址:https://www.cnblogs.com/linlf03/p/12266225.html
Copyright © 2020-2023  润新知