把spring应用跑起来
开始进入run方法:
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
return new SpringApplication(primarySources).run(args);
}
step into run()
public ConfigurableApplicationContext run(String... args) {
//停止监听器,监控整个应用的启动和停止的
StopWatch stopWatch = new StopWatch();
//start方法里的源码可以看下面代码展示
stopWatch.start();//记录应用的启动时间
//创建引导上下文(xxxContext都是引导环境)
DefaultBootstrapContext bootstrapContext = createBootstrapContext();//createBootstrapContext方法的源码在下面
ConfigurableApplicationContext context = null;
//让当前应用进入headless模式。源码在下面
//(headless是自力更生的意思,不依赖别人)
configureHeadlessProperty();
//获取所有RunListener(运行监听器)保存到SpringApplicationRunListeners
//【为了方便所有Listener进行事件感知】所谓的监听器就是监听到当前项目的状态
SpringApplicationRunListeners listeners = getRunListeners(args);
//starting()源码分析在下面
listeners.starting(bootstrapContext, this.mainApplicationClass);
try {
//准备ApplicationArguments应用参数,应用参数是从命令行里传过来的。即保存命令行参数
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
//准备运行时环境
ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);//这行代码结束后,所有的环境信息已经准备就绪
//配置一些要忽略的bean信息
configureIgnoreBeanInfo(environment);
//打印banner(banner是啥,可以看下面)
Banner printedBanner = printBanner(environment);
//创建ioc容器(容器创建完成后,所有的bean都会进去)
context = createApplicationContext();//源码在下面
//把Startup信息保存起来
context.setApplicationStartup(this.applicationStartup);
//准备ioc容器环境的信息(源码在下面)
prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
//刷新ioc容器(方法的源码在下面)
refreshContext(context);
//===============到这里为止,ioc容器就创建完成了==================
//容器刷新完成后要做的工作
afterRefresh(context, applicationArguments);
//监听到容器全部启动完成
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
}
//遍历所有监听器 调用 listeners.started(context);
//通知所有的监听器started 项目已经启动了(通知监听器又一个事干好了)所以在这里就可以访问8080了
listeners.started(context);
//调用所有runners
callRunners(context, applicationArguments);
}
catch (Throwable ex) {
//如果有异常,还会捕获异常(捕获源码在下面)
handleRunFailure(context, ex, listeners);
throw new IllegalStateException(ex);
}
try {
//没有任何异常就调用所有监听器的 running 方法 listeners.running(context);
//通知所有的监听器 running项目已经进入running状态了
listeners.running(context);
}
catch (Throwable ex) {
//如果有异常,继续捕获异常
handleRunFailure(context, ex, null);
throw new IllegalStateException(ex);
}
return context;
}
banner:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.0)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。