在应用程序启动之前运行自定义代码的不同方法

时间:2019-01-19 09:03:41

标签: spring spring-boot

在应用程序启动数据初始化或其他操作之前,您能描述一下运行自定义代码的不同方法吗? (例如ApplicationListenerCommandLineRunner等)

它们之间有什么区别?哪种情况下最好将它们一起使用? 我不仅想知道这样做的一种方式,还想知道我何时需要使用什么。

这里有足够多的古老问题,有太多选择可以做到:Running code after Spring Boot starts

如果在错误的地方提出这个问题,请给我指出正确的地方。

2 个答案:

答案 0 :(得分:2)

我知道哪些选择:

  1. CommandLineRunner-以字符串形式接收命令行参数

    @Element() el: HTMLElement;
    
    this.el.querySelector('slider-input').addEventListener('valueChange', e => {
      switch(e.currentTarget.slider_id) {
        case 'slider_A':
          console.log('event A');
          break;
        case 'slider_B':
          console.log('event B');
          break;
      }
    });
    
    // or
    
    this.el.querySelector('slider-input[slider_id=slider_A]')
      .addEventListener('valueChange', () => console.log('event A');
    
  2. ApplicationRunner-接收带有名称的命令行参数

    @Slf4j
    @Component
    public class DemoCommandLineRunner implements CommandLineRunner {
    
        @Override
        public void run(String... args) {
            log.info("[CommandLineRunner] Args: " + Arrays.toString(args));
        }
    }
    
  3. ApplicationListener-不同事件的侦听器(对于每个事件自己的类)

    @Slf4j
    @Component
    public class DemoApplicationRunner implements ApplicationRunner {
    
        @Override
        public void run(ApplicationArguments args) {
            log.info("[ApplicationRunner] Args: ");
            nonOptionArgs(args);
            optionArgs(args);
        }
    
        private void nonOptionArgs(ApplicationArguments args) {
            args.getNonOptionArgs().forEach(log::info);
        }
    
        private void optionArgs(ApplicationArguments args) {
            args.getOptionNames().stream()
                    .map(args::getOptionValues)
                    .map(Objects::toString)
                    .forEach(log::info);
        }
    }
    
  4. @EventListener-不同事件的侦听器(一个bean中有多个事件)

    @Slf4j
    @Component
    public class DemoApplicationListener implements ApplicationListener<ApplicationEvent> {
    
        @Override
        public void onApplicationEvent(ApplicationEvent event) {
            logEvent(event);
        }
    
        private void logEvent(ApplicationEvent event) {
            log.info("[DemoApplicationListener] Event: " + event);
        }
    }
    
  5. SmartLifecycle-配置bean生命周期

    @Slf4j
    @Component
    public class DemoEventApplicationListener {
    
        @EventListener
        public void handleContextRefreshedEvent(ContextRefreshedEvent event) {
            logEvent(event);
        }
    
        @EventListener
        public void handleApplicationReadyEvent(ApplicationReadyEvent event) {
            logEvent(event);
        }
    
        private void logEvent(ApplicationEvent event) {
            log.info("[DemoEventApplicationListener] Event: " + event);
        }
    }
    

Github存储库:https://github.com/venkaDaria/demo-bootstrap-spring

答案 1 :(得分:0)

如果您需要运行一些代码“ 一旦SpringApplication启动”,则应使用ApplicationRunnerCommandLineRunner-它们在{{3}中工作}。

ApplicationListener@EventListenerApplicationReadyEvent也是一样。

请参阅我的the same way

您将选择的选项取决于您的偏好。