我想在spring-boot应用程序开始监视目录更改之后运行代码。
我已经尝试运行一个新线程,但@Autowired服务还没有设置在那一点。
我已经能够找到ApplicationPreparedEvent,它在@Autowired注释设置之前触发。理想情况下,我希望事件在应用程序准备好处理http请求时触发。
是否有更好的事件可以使用,或者在应用程序在spring-boot中激活后运行代码的更好方法?
我想在spring-boot应用程序开始监视目录更改之后运行代码。
我已经尝试运行一个新线程,但@Autowired服务还没有设置在那一点。
我已经能够找到ApplicationPreparedEvent,它在@Autowired注释设置之前触发。理想情况下,我希望事件在应用程序准备好处理http请求时触发。
是否有更好的事件可以使用,或者在应用程序在spring-boot中激活后运行代码的更好方法?
当前回答
我非常喜欢@cahen (https://stackoverflow.com/a/44923402/9122660)对EventListener注释的使用建议,因为它非常干净。不幸的是,我不能让它在Spring + Kotlin设置中工作。对Kotlin有效的方法是将类作为方法参数添加:
@EventListener
fun doSomethingAfterStartup(event: ApplicationReadyEvent) {
System.out.println("hello world, I have just started up");
}
其他回答
在春季> 4.1中使用SmartInitializingSingleton bean
@Bean
public SmartInitializingSingleton importProcessor() {
return () -> {
doStuff();
};
}
作为备选方案,CommandLineRunner bean可以实现,也可以使用@PostConstruct注释bean方法。
你试过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/
下面是文档中提到的启动事件:
... Application events are sent in the following order, as your application runs: An ApplicationStartedEvent is sent at the start of a run, but before any processing except the registration of listeners and initializers. An ApplicationEnvironmentPreparedEvent is sent when the Environment to be used in the context is known, but before the context is created. An ApplicationPreparedEvent is sent just before the refresh is started, but after bean definitions have been loaded. An ApplicationReadyEvent is sent after the refresh and any related callbacks have been processed to indicate the application is ready to service requests. An ApplicationFailedEvent is sent if there is an exception on startup. ...
ApplicationReadyEvent仅在您希望执行的任务不是正确服务器操作所必需的情况下才有用。启动异步任务来监视某些内容的更改就是一个很好的例子。
然而,如果你的服务器在任务完成之前处于“未准备好”状态,那么最好实现SmartInitializingSingleton,因为你会在你的REST端口被打开和你的服务器为业务打开之前得到回调。
不要试图将@PostConstruct用于只应该发生一次的任务。当你注意到它被多次调用时,你会感到粗鲁的惊讶……
为spring boot应用程序实现CommandLineRunner。 你需要实现run方法,
public classs SpringBootApplication implements CommandLineRunner{
@Override
public void run(String... arg0) throws Exception {
// write your logic here
}
}
您可以使用ApplicationRunner扩展类,重写run()方法并在那里添加代码。
import org.springframework.boot.ApplicationRunner;
@Component
public class ServerInitializer implements ApplicationRunner {
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
//code goes here
}
}