SpringBoot启动后如何自动执行初始化方法

  Spring Boot启动后有三种回调方式,即实现ApplicationContextInitializer、ApplicationRunner或CommandLineRunner接口。

一、实现ApplicationContextInitializer接口

  1、方法1:调用SpringApplication的addInitializers方法注册

  1)自定义初始化类,实现ApplicationContextInitializer接口

public class MyApplicationContextInitializer implements
        ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("当前容器bean数量:"+applicationContext.getBeanDefinitionCount());
    }
}

  2)容器启动时调用SpringApplication的addInitializers方法

public static void main(String[] args) {
    SpringApplication app=new SpringApplication(App.class);
    app.addInitializers(new MyApplicationContextInitializer());
    ConfigurableApplicationContext context= app.run(args);
    context.close();
}

  说明:若有多个初始化类,在main方法中add多次即可,启动后执行顺次与add顺序一致,也可以使用@Order(n)注解改变执行顺序

  2、方法2:配置文件中设置属性注册

  1)自定义初始化类,实现ApplicationContextInitializer接口(同上)

  2)application.properties中配置context.initializer.classes属性

context.initializer.classes=com.leiyuke.temp.init.MyApplicationContextInitializer,\
  com.leiyuke.temp.init.MyApplicationContextInitializer2

  说明:若定义多个初始化类,在配置文件中设置多个即可,启动后执行顺次与配置顺序一致,也可以使用@Order(n)注解改变执行顺序

  3、方法3:使用spring.factories机制

  1)自定义初始化类,实现ApplicationContextInitializer接口(同上)

  2)新建resources/META-INF/spring.factories文件

org.springframework.context.ApplicationContextInitializer=com.leiyuke.temp.init.MyApplicationContextInitializer2,\
  com.leiyuke.temp.init.MyApplicationContextInitializer

  说明:

  1)若定义多个初始化类,在配置文件中设置多个即可,启动后执行顺次与配置顺序一致,也可以使用@Order(n)注解改变执行顺序

  2)spring.factories机制扫描所有工程中的/META-INF/spring.factories文件,所以引入相关工程的依赖后,也可执行其初始化方法

二、实现ApplicationRunner接口

@Component
public class ServerSuccessReport implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ServerSuccessReport2:"+Arrays.asList(args.getSourceArgs()));
    }
}
public static void main(String[] args) {
    SpringApplication app=new SpringApplication(App.class);
    ConfigurableApplicationContext context= app.run("aa","bb ");
    context.close();
}

三、实现CommandLineRunner接口

@Component
public class ServerSuccessReport implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("ServerSuccessReport1:"+ Arrays.asList(args));
    }
}
public static void main(String[] args) {
    SpringApplication app=new SpringApplication(App.class);
    ConfigurableApplicationContext context= app.run("aa","bb ");
    context.close();
}

  执行二、三输出:

  

  说明:

  1)默认执行顺序ApplicationContextInitializer、ApplicationRunner、CommandLineRunner

  2)ApplicationRunner与CommandLineRunner可通过@Order改变顺序使CommandLineRunner早于ApplicationRunner执行

  3)两个Runner的区别:CommandLineRunner参数是原始的,ApplicationRunner是对原始参数的封装

posted @ 2019-11-23 17:57  雷雨客  阅读(2272)  评论(0)    收藏  举报