把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;
    }

image.png
banner:

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.0)


無題
8 声望1 粉丝

沉迷java无法自拔。