程序启动执行

项目开发   2024-07-12 10:45   751   0  

在使用 Spring Boot 开发时,有几种方法可以在程序启动后立即执行代码。以下是所有主要方法的总结及其使用场景和优缺点对比:

1. ApplicationRunnerCommandLineRunner

ApplicationRunner

@Component
public class MyAppRunner implements ApplicationRunner {    
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("Application started with the following arguments:");        
        for (String arg : args.getSourceArgs()) {
            System.out.println(arg);
        }        
    }
}

CommandLineRunner

@Component
public class MyCommandLineRunner implements CommandLineRunner {    
       @Override
    public void run(String... args) throws Exception {
        System.out.println("Application started with the following arguments:");        
        for (String arg : args) {
            System.out.println(arg);
        }      
    }
}

使用场景:

  • 当需要在应用程序启动完成后立即执行一些全局初始化任务时使用。

  • 需要访问应用程序启动参数时,分别使用 ApplicationRunner(使用 ApplicationArguments)或 CommandLineRunner(使用 String[] args)。

优点:

  • 简单直接,易于实现和使用。

  • 适用于全局初始化任务。

缺点:

  • 如果需要在特定 Bean 初始化后执行代码,不是最佳选择。

2. @PostConstruct

@Component
public class MyBean {    
    @PostConstruct
    public void init() {
        System.out.println("Bean is initialized");        
    }
}

使用场景:

  • 需要在某个特定 Bean 初始化完成后执行任务时使用。

优点:

  • 直接与 Bean 的生命周期相关,适用于特定 Bean 的初始化任务。

缺点:

  • 仅适用于特定 Bean 的初始化任务,不能用于全局初始化。

3. InitializingBean 接口

@Component
public class MyBean implements InitializingBean {    
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Bean is initialized");        
    }
}

使用场景:

  • 需要在特定 Bean 初始化完成后执行任务时使用。

优点:

  • 直接与 Bean 的生命周期相关,适用于特定 Bean 的初始化任务。

缺点:

  • 仅适用于特定 Bean 的初始化任务,不能用于全局初始化。

4. 事件监听器

ApplicationListener<ContextRefreshedEvent>

@Component
public class MyContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {    
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("Application context refreshed");        
    }
}

@EventListener

@Component
public class MyEventListener {    
    @EventListener
    public void handleContextRefresh(ContextRefreshedEvent event) {
        System.out.println("Application context refreshed");        
    }
}

使用场景:

  • 需要在整个应用上下文刷新后执行任务时使用。

优点:

  • 适用于全局初始化任务。

  • 可以处理不同类型的事件,灵活性较高。

缺点:

  • 对于简单的初始化任务,可能显得有些复杂。

对比总结

方法使用场景优点缺点
ApplicationRunner全局初始化任务,需要访问启动参数简单直接,适合全局初始化无法用于特定 Bean 初始化
CommandLineRunner全局初始化任务,需要访问启动参数简单直接,适合全局初始化无法用于特定 Bean 初始化
@PostConstruct特定 Bean 初始化完成后执行任务与 Bean 生命周期直接相关仅适用于特定 Bean 初始化任务
InitializingBean特定 Bean 初始化完成后执行任务与 Bean 生命周期直接相关仅适用于特定 Bean 初始化任务
ApplicationListener全局初始化任务,在上下文刷新后执行适用于全局初始化任务,灵活性高对于简单任务可能显得复杂
@EventListener全局初始化任务,在上下文刷新后执行适用于全局初始化任务,灵活性高对于简单任务可能显得复杂

根据具体需求选择合适的方法。如果只是全局初始化任务,ApplicationRunnerCommandLineRunner 是最简洁的选择;如果需要在特定 Bean 初始化后执行任务,@PostConstructInitializingBean 更适合;如果需要在上下文刷新后执行任务,事件监听器(ApplicationListener@EventListener)是不错的选择。


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。