我想在spring-boot应用程序开始监视目录更改之后运行代码。

我已经尝试运行一个新线程,但@Autowired服务还没有设置在那一点。

我已经能够找到ApplicationPreparedEvent,它在@Autowired注释设置之前触发。理想情况下,我希望事件在应用程序准备好处理http请求时触发。

是否有更好的事件可以使用,或者在应用程序在spring-boot中激活后运行代码的更好方法?


当前回答

为spring boot应用程序实现CommandLineRunner。 你需要实现run方法,

public classs SpringBootApplication implements CommandLineRunner{

    @Override
        public void run(String... arg0) throws Exception {
        // write your logic here 

        }
}

其他回答

ApplicationReadyEvent仅在您希望执行的任务不是正确服务器操作所必需的情况下才有用。启动异步任务来监视某些内容的更改就是一个很好的例子。

然而,如果你的服务器在任务完成之前处于“未准备好”状态,那么最好实现SmartInitializingSingleton,因为你会在你的REST端口被打开和你的服务器为业务打开之前得到回调。

不要试图将@PostConstruct用于只应该发生一次的任务。当你注意到它被多次调用时,你会感到粗鲁的惊讶……

在春季> 4.1中使用SmartInitializingSingleton bean

@Bean
public SmartInitializingSingleton importProcessor() {
    return () -> {
        doStuff();
    };

}

作为备选方案,CommandLineRunner bean可以实现,也可以使用@PostConstruct注释bean方法。

Try:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer {

    @SuppressWarnings("resource")
    public static void main(final String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

        context.getBean(Table.class).fillWithTestdata(); // <-- here
    }
}

为什么不创建一个bean,在初始化时启动监视器呢?

@Component
public class Monitor {
    @Autowired private SomeService service

    @PostConstruct
    public void init(){
        // start your monitoring in here
    }
}

在为bean完成任何自动装配之前,不会调用init方法。

Spring引导提供了一个带有run()方法的ApplicationRunner接口,在应用程序启动时调用该方法。 但是,我们有一个ApplicationArguments类的实例,而不是传递给回调方法的原始String参数。

@Component
public class AppStartupRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        //some logic here
    }
}