zoukankan      html  css  js  c++  java
  • SpringBoot-启动应用及回调监听

    主类Main方法

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

    创建SpringApplication对象

    public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    	return (new SpringApplication(primarySources)).run(args);
    }  

      构造器

    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();
    }
    

      ApplicationContextInitializer&ApplicationListener

        读取META-INF/spring.factories文件中的类 

    this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
    this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));

    执行run方法 

    public ConfigurableApplicationContext run(String... args) {
    	StopWatch stopWatch = new StopWatch();
    	stopWatch.start();
    	// IOC容器
    	ConfigurableApplicationContext context = null;
    	Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
    	this.configureHeadlessProperty();
    	// 读取META-INF/spring.factories文件获得SpringApplicationRunListener的实现类集合
    	SpringApplicationRunListeners listeners = this.getRunListeners(args);
    	// 监听开始,回调所有SpringApplicationRunListener的starting()方法
    	listeners.starting();
    
    	Collection exceptionReporters;
    	try {
    		ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    		// 监听配置环境准备好了,回调所有SpringApplicationRunListener的environmentPrepared()方法
    		ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
    		this.configureIgnoreBeanInfo(environment);
    		Banner printedBanner = this.printBanner(environment);
    		// 创建IOC容器
    		context = this.createApplicationContext();
    		exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
    		// 回调ApplicationContextInitializer的initialize()方法,回调SpringApplicationRunListener的contextPrepared()方法
    		// 回调SpringApplicationRunListener的contextLoaded()方法
    		this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
    		// 刷新IOC容器,注入组件
    		this.refreshContext(context);
    		this.afterRefresh(context, applicationArguments);
    		stopWatch.stop();
    		if (this.logStartupInfo) {
    			(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
    		}
    		// 回调SpringApplicationRunListener的started()方法
    		listeners.started(context);
    		// 从IOC容器中获得ApplicationRunner、CommandLineRunner的所有组件,回调ApplicationRunner、CommandLineRunner的run()方法
    		this.callRunners(context, applicationArguments);
    	} catch (Throwable var10) {
    		this.handleRunFailure(context, var10, exceptionReporters, listeners);
    		throw new IllegalStateException(var10);
    	}
    
    	try {
    		// 回调SpringApplicationRunListener的running()方法
    		listeners.running(context);
    		return context;
    	} catch (Throwable var9) {
    		this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
    		throw new IllegalStateException(var9);
    	}
    }
    

      

      

  • 相关阅读:
    ELK学习实验004:Elasticsearch的简单介绍和操作
    ELK学习实验003:Elasticsearch 集群安装
    ELK学习实验002:Elasticsearch介绍及单机安装
    ELK学习实验001:Elastic Stack简介
    Eclipse 笔记
    自动
    Kali 无线网络
    安全和匿名
    Java 异常处理
    Java 构造结构私有化
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/12034505.html
Copyright © 2011-2022 走看看