在应用程序启动数据初始化或其他操作之前,您能描述一下运行自定义代码的不同方法吗?
(例如ApplicationListener
,CommandLineRunner
等)
它们之间有什么区别?哪种情况下最好将它们一起使用? 我不仅想知道这样做的一种方式,还想知道我何时需要使用什么。
这里有足够多的古老问题,有太多选择可以做到:Running code after Spring Boot starts
如果在错误的地方提出这个问题,请给我指出正确的地方。
答案 0 :(得分:2)
我知道哪些选择:
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');
ApplicationRunner-接收带有名称的命令行参数
@Slf4j
@Component
public class DemoCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) {
log.info("[CommandLineRunner] Args: " + Arrays.toString(args));
}
}
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);
}
}
@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);
}
}
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
启动”,则应使用ApplicationRunner
或CommandLineRunner
-它们在{{3}中工作}。
ApplicationListener
或@EventListener
与ApplicationReadyEvent
也是一样。
请参阅我的the same way。
您将选择的选项取决于您的偏好。