问题

我希望在myspring-bootapp开始监视目录以进行更改后运行代码。

我已经尝试运行一个新线程,但此时尚未设置@Autowired服务。

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

是否有更好的事件要使用,或者在应用程序运行后运行代码的更好方法是在6740708030 spring-boot**?


#1 热门回答(106 赞)

这很简单:

@EventListener(ApplicationReadyEvent.class)
public void doSomethingAfterStartup() {
    System.out.println("hello world, I have just started up");
}

测试版本1.5.1.RELEASE


#2 热门回答(69 赞)

为什么不创建一个在初始化时启动监视器的bean,例如:

@Component
public class Monitor {
    @Autowired private SomeService service

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

在对bean进行任何自动装配之前,不会调用init方法。


#3 热门回答(65 赞)

你试过ApplicationReadyEvent吗?

@Component
public class ApplicationStartup 
implements ApplicationListener<ApplicationReadyEvent> {

  /**
   * This event is executed as late as conceivably possible to indicate that 
   * the application is ready to service requests.
   */
  @Override
  public void onApplicationEvent(final ApplicationReadyEvent event) {

    // here your code ...

    return;
  }
}

代码:http://blog.netgloo.com/2014/11/13/run-code-at-spring-boot-startup/

这就是documentation关于启动事件的内容:

...应用程序事件在应用程序运行时按以下顺序发送:ApplicationStartedEvent在运行开始时发送,但在除侦听器和初始化程序注册之外的任何处理之前发送。当要在上下文中使用的环境已知但在创建上下文之前,将发送ApplicationEnvironmentPreparedEvent。 ApplicationPreparedEvent在刷新开始之前发送,但是在加载bean定义之后发送。刷新后发送ApplicationReadyEvent,并且已处理任何相关的回调以指示应用程序已准备好为请求提供服务。如果启动时发生异常,则发送ApplicationFailedEvent。 ...


原文链接