写于:2018-12-04 08:08:30

# Spring Boot 应用启动方式-run方法直接启动

springboot概述 中,创建 spring boot 应用,导入 spring-boot-starter-web 后,通过一个 Application.java 便能够直接启动应用程序。

# Application.java 主要启动代码

@SpringBootApplication		// 启动类标注
public class Application {
	public static void main(String[] args) {
        // 真实启动的方法
		SpringApplication.run(Application.class, args);
	}
}

上述代码直接通过 SpringApplication#run 方法便可以启动一个应用程序。

下面深入 SpringApplication#run 查看该方法究竟做了什么

# SpringApplication#run 部分代码如下

public class SpringApplication {
	public ConfigurableApplicationContext run(String... args) {
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		ConfigurableApplicationContext context = null;
		FailureAnalyzers analyzers = null;
		configureHeadlessProperty();
		SpringApplicationRunListeners listeners = getRunListeners(args);
		listeners.starting();
		try {
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(
					args);
			ConfigurableEnvironment environment = prepareEnvironment(listeners,
					applicationArguments);
			Banner printedBanner = printBanner(environment);
             // 创建 Spring 上下文
			context = createApplicationContext();
			analyzers = new FailureAnalyzers(context);
			prepareContext(context, environment, listeners, applicationArguments,
					printedBanner);
             // 重启IOC 容器
			refreshContext(context);
			afterRefresh(context, applicationArguments);
			listeners.finished(context, null);
			stopWatch.stop();
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass)
						.logStarted(getApplicationLog(), stopWatch);
			}
			return context;
		}
		catch (Throwable ex) {
			handleRunFailure(context, listeners, analyzers, ex);
			throw new IllegalStateException(ex);
		}
	}
}

抛开整体的代码不看,相信对 SpringFramework 有了解的人都知道,在 SpringApplication#run 方法中我们可以看到 ConfigurableApplicationContext 可配置的 Spring上下文 ,以及 refreshContext() 启动(重启) IOC 容器。

到这里能够知道 Spring Boot 本身还是运行的 springframework 。

# 定义一个简单的 mian 方法,通过代码的方式启动应用

从上面的分析,我们可以知道,spring boot 应用程序 Application.javarun 方法 可以理解为就是 在启动 spring IOC 容器,只不过 spring boot 在此基础上多做一些相关的操作。

# 简单启动 Spring 上下文,启动 IOC容器调用 容器方法 (WEB 应用类似) (spring-boot-learn-3)

public class MyApplication {
    public static void main(String[] args) throws Exception{
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.scan("com.qguofeng.controller");
        context.refresh();

        Learn3Controller bean = (Learn3Controller)context.getBean("learn3Controller");
        String s = bean.learn3();
        System.out.println(s);
        /*System.in.read();*/
    }
}
精彩内容推送,请关注公众号!
最近更新时间: 4/5/2020, 3:33:26 PM