2.naco源码分析之-StartingSpringApplicationRunListener

spring启动后,多个类会被初始化加载,这里主要通过日志查看启动了哪些类:

首先,启动时候,日志提示log信息会放在start.out中,查看start.out文件可以找到日志来自StartingSpringApplicationRunListener类:

public class StartingSpringApplicationRunListener implements SpringApplicationRunListener

该类实现了SpringApplicationRunListener接口,SpringApplicationRunListener 是springboot定义的一个接口,定义了在spring项目整个生命周期内被调用的方法,这里重点实现了如下几个方法:

1.starting

该starting方法的执行处于非常早的时期就会被调用,基本可以任务应用一启动就会执行该方法。

/**
 * Called immediately when the run method has first started. Can be used for very
 * early initialization.
 */
void starting();

来看StartingSpringApplicationRunListener 对该方法的实现:

private volatile boolean starting;



@Override public void starting() { starting = true; }

 

这里简单定义了一个volatile变量来标记集群的启动状态为正在启动中,利用volatile的多线程可见性,后续可能会有一些组件通过该状态来判断是否执行一个操作,比如等到正在启动状态结束后执行一些操作。

 

2.environmentPrepared

 

首先看该方法定义,该方法的执行时机是在环境准备完毕,但是ApplicationContext被创建之前执行,下面看该方法做了哪些操作:

/**
 * Called once the environment has been prepared, but before the
 * {@link ApplicationContext} has been created.
 * @param environment the environment
 */
void environmentPrepared(ConfigurableEnvironment environment);

这里基本上就是设置一些集群环境变量,记录一些状态。

@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
    //设置集群模式
    if (STANDALONE_MODE) {
        System.setProperty(MODE_PROPERTY_KEY_STAND_MODE, "stand alone");
    } else {
        System.setProperty(MODE_PROPERTY_KEY_STAND_MODE, "cluster");
    }
    if (FUNCTION_MODE == null) {
       System.setProperty(MODE_PROPERTY_KEY_FUNCTION_MODE, "All");
    } else if(SystemUtils.FUNCTION_MODE_CONFIG.equals(FUNCTION_MODE)){
        System.setProperty(MODE_PROPERTY_KEY_FUNCTION_MODE, SystemUtils.FUNCTION_MODE_CONFIG);
    } else if(SystemUtils.FUNCTION_MODE_NAMING.equals(FUNCTION_MODE)) {
        System.setProperty(MODE_PROPERTY_KEY_FUNCTION_MODE, SystemUtils.FUNCTION_MODE_NAMING);
    }


    System.setProperty(LOCAL_IP_PROPERTY_KEY, LOCAL_IP);
}

 

3.contextPrepared

/**
 * Called once the {@link ApplicationContext} has been created and prepared, but
 * before sources have been loaded.
 * @param context the application context
 */
void contextPrepared(ConfigurableApplicationContext context);

当ApplicationContext构建完成时,该方法被调用。

@Override
public void contextPrepared(ConfigurableApplicationContext context) {
    //加载cluster.conf文件
    logClusterConf();
    //打印日志,每秒一条,直到系统启动完成
    //利用volatile的starting变量,每秒打印一次,如果一直starting状态就一直执行。
    logStarting();
}

@Override public void contextPrepared(ConfigurableApplicationContext context) { //加载cluster.conf文件 logClusterConf(); //打印日志,每秒一条,直到系统启动完成 //利用volatile的starting变量,每秒打印一次,如果一直starting状态就一直执行。 logStarting(); }

该方法主要加载配置文件并打印日志。

4.started

/**
 * The context has been refreshed and the application has started but
 * {@link CommandLineRunner CommandLineRunners} and {@link ApplicationRunner
 * ApplicationRunners} have not been called.
 * @param context the application context.
 * @since 2.0.0
 */
void started(ConfigurableApplicationContext context);

该方法在bean加载完成后触发。

@Override
public void started(ConfigurableApplicationContext context) {
    starting = false;

    if (scheduledExecutorService != null) {
        scheduledExecutorService.shutdownNow();
    }
    //打印log,data,conf路径
    logFilePath();

    LOGGER.info("Nacos started successfully in {} mode.", System.getProperty(MODE_PROPERTY_KEY_STAND_MODE));
}

首先该方法修改了starting 为false,此时,logStarting()会停止打印正在启动的信息,然后,打印一些成功启动的信息。启动完成。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值