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()会停止打印正在启动的信息,然后,打印一些成功启动的信息。启动完成。