springboot执行流程初探
最近的一个项目需要修改Java端逻辑,项目中使用的是springboot,故而在此处需要探究一下springboot的执行流程,以方便我在项目中对数据同步模块进行更改。
基本概述
SpringBoot将Spring应用的启动流程进行了一个“模板化”的操作,所以我们才能通过SpringApplication.run(XXX.class, args)的方式来进行一站式的启动。
不同于以往的springmvc,sturts1,sturts2等,springboot在最大限度上去除了人为配置,这在一定程度上避免了代码过程中的低效操作,增强了代码的模块化开发。
毕竟没有人对反复开发砖块感兴趣。
SpringBoot应用启动步骤简要示意图

SpringApplicationRunListener
SpringApplicationRunListener是SpringBoot执行过程中,不同执行时间点时间通知的监听者,一般来说也没有必要自己实现一个SpringApplicationRunListener,即使是SpringBoot默认也只实现了一个org.springframework.boot.context.event.EventPublishingRunListener。通过这个类,在SpringBoot启动时,在不同的时间点发布不同的应用事件类型ApplicationEvent。
SpringBoot初始化时加载的ApplicationListener如果对这些事件感兴趣,则可以接收并处理。
public interface SpringApplicationRunListener {
void started();
void environmentPrepared(ConfigurableEnvironment environment);
void contextPrepared(ConfigurableApplicationContext context);
void contextLoaded(ConfigurableApplicationContext context);
void finished(ConfigurableApplicationContext context, Throwable exception);
}
ApplicationContextInitializer
可以在ApplicationContext调用refresh()方法前,对ApplicationContext对象做进一步的设置或者处理。
public interface ApplicationContextInitializer {
void initialize(C applicationContext);
}
void initialize(C applicationContext);
}
ApplicationRunner和CommandLineRunner
我们在开发中可能会有这样的情景。需要在容器启动的时候执行一些内容。比如读取配置文件,数据库连接之类的。SpringBoot给我们提供了两个接口来帮助我们实现这种需求。这两个接口分别为CommandLineRunner和ApplicationRunner。他们的执行时机为容器启动完成的时候。
这两个接口中有一个run方法,我们只需要实现这个方法即可。这两个接口的不同之处在于:ApplicationRunner中run方法的参数为ApplicationArguments,而CommandLineRunner接口中run方法的参数为String数组。
如果有多个实现类,而你需要他们按一定顺序执行的话,可以在实现类上加上@Order注解。@Order(value=整数值)。SpringBoot会按照@Order中的value值从小到大依次执行。
ApplicationRunner
public interface ApplicationRunner {
void run(ApplicationArguments args) throws Exception;
}
CommandLineRunner
public interface CommandLineRunner {
void run(String... args) throws Exception;
}
==============================================================================================================================
SpringBoot执行流程详细版


浙公网安备 33010602011771号