当前位置: 首页 > 知识库问答 >
问题:

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

佴阳曦
2023-03-14

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

它们之间有什么不同?在哪种情况下使用它们更好?我想知道的不仅仅是一种方法,而是一种理解什么时候和什么我需要使用。

这里有一个足够老的问题,有太多的选项可以这样做:在Spring Boot开始后运行代码

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

共有1个答案

融渊
2023-03-14

我知道哪些选项:

>

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

    @Slf4j
    @Component
    public class DemoCommandLineRunner implements CommandLineRunner {
    
        @Override
        public void run(String... args) {
            log.info("[CommandLineRunner] Args: " + Arrays.toString(args));
        }
    }
    

    ApplicationRunner-接收带有名称的命令行参数

    @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);
        }
    }
    
    @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);
        }
    }
    
    @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);
        }
    }
    
    @Slf4j
    @Component
    public class DemoSmartLifecycle implements SmartLifecycle {
    
        private boolean isRunning;
    
        @Override
        public void start() {
            isRunning = true;
            log.info("[DemoSmartLifecycle]: Start");
        }
    
        @Override
        public void stop() {
            isRunning = false;
            log.info("[DemoSmartLifecycle]: Stop");
        }
    
        @Override
        public boolean isRunning() {
            return isRunning;
        }
    }
    
    @Slf4j
    @Component
    public class DemoSmartInitializingSingleton implements SmartInitializingSingleton {
    
        @Override
        public void afterSingletonsInstantiated() {
            log.info("[SmartInitializingSingleton] afterSingletonsInstantiated");
        }
    }
    

  •  类似资料:
    • 问题内容: 我的目标是让我的Flask应用程序启动后运行任意代码。这是我所拥有的: 理想情况下,我将能够做到这一点: 但是代码不会继续过去,因此永远不会运行。 我目前正在解决的解决方案是在与分开的线程中运行,创建一个设置此功能的函数: 然后获取)来向应用发出基本请求,以便运行“先请求之前”代码。这相当复杂,难以记录。我宁愿使用Flask中已经提供的参数,也可以使用装饰器,但据我所知,这两个都不存在

    • 当尝试运行或调试带有applicationIdSuffix(.debug)的自定义BuildType时,手机上安装了应用程序,但正确的活动实际上并没有启动。实际上,启动了具有原始包名的活动(示例:在应该启动com.fobbymaster.app.debug时启动了com.fobbymaster.app)。 我在想,有一些配置需要修改,但我似乎找不到。 有什么想法吗? 设备SHELL命令:pm in

    • 问题内容: 我写了一个Qt应用程序,它将在Linux上运行。它应该在启动时运行。 它应该在每个Linux- Suse,RedHat等上运行。 我应该写什么脚本,放在哪里? 我根本不知道如何编写脚本,因此,如果您附上示例,我将不胜感激。 问题答案: 您需要为您的应用程序创建一个桌面入口文件(请参阅此处),并将其放置在用户目录中。 Window Manager启动时,该目录中的任何桌面条目文件都将被执

    • 当我的树莓电源故障时,Android的东西在主页上重启,而没有我的应用程序,我必须手动重新发送它,我如何修复Android的东西在重启时自动运行应用程序?

    • 我需要某种方式来启动我的Java应用程序,而不强制用户手动运行应用程序。我不完全确定我将如何做到这一点,有人能提供任何帮助吗?

    • 问题内容: 我有一个包含Java应用程序的JAR文件。如何使它从Windows开始而不需要用户交互? 问题答案: 创建一个.bat文件,并将其放入其中: 然后将.bat文件放入Windows启动文件夹。 还有一件事:使用java和javaw之间是有区别的。虽然在调试应用程序时使用Java更好,但应用程序会打印文本或类似内容,而在不需要时,javaw则更好。为什么?因为java使用控制台显示所有应用