Spring Boot启动后运行代码

我想在我的spring-boot应用程序开始监视一个目录的变化后运行代码。

我试过运行一个新的线程,但@Autowired服务尚未设置在这一点上。

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

有没有更好的事件使用,或更好的方式来运行应用程序后, 春季启动

尝试:

 @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 } } 

为什么不创build一个在初始化时启动监视器的bean,如下所示:

 @Component public class Monitor { @Autowired private SomeService service @PostConstruct public void init(){ // start your monitoring in here } } 

直到对bean进行了任何自动assembly, init方法才会被调用。

“Spring Boot”的方式是使用一个CommandLineRunner 。 只要添加这种types的豆子,你就可以走了。 在Spring 4.1(Boot 1.2)中,还有一个SmartInitializingBean ,在初始化完成后会得到一个callback。 还有SmartLifecycle (从Spring 3开始)。

你有没有尝试过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/

这是文档提到有关启动事件的内容:

应用程序事件按照以下顺序发送,就像您的应用程序运行一样:

ApplicationStartedEvent在运行开始时发送,但在除监听器和初始化器注册之外的任何处理之前发送。

当在上下文中使用的环境是已知的,但是在创build上下文之前,发送ApplicationEnvironmentPreparedEvent。

ApplicationPreparedEvent在刷新开始之前发送,但是在bean定义加载之后。

在刷新之后发送ApplicationReadyEvent,并且已经处理了任何相关的callback以指示应用程序已准备好为请求提供服务。

如果启动时出现exception,则发送ApplicationFailedEvent。

这是如此简单:

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

testing版本1.5.1.RELEASE

您可以使用ApplicationRunner扩展一个类,并覆盖run()方法并在其中添加代码。

 import org.springframework.boot.ApplicationRunner; @Component public class ServerInitializer implements ApplicationRunner { @Override public void run(ApplicationArguments applicationArguments) throws Exception { //code goes here } } 

在spring> 4.1中使用SmartInitializingSingleton bean

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

另外一个CommandLineRunner bean也可以用@PostConstruct来实现或注释一个bean方法。

为Dave Syer的答案提供一个例子,它像一个魅力:

 @Component public class CommandLineAppStartupRunner implements CommandLineRunner { private static final Logger logger = LoggerFactory.getLogger(CommandLineAppStartupRunner.class); @Override public void run(String...args) throws Exception { logger.info("Application started with command-line arguments: {} . \n To kill this application, press Ctrl + C.", Arrays.toString(args)); } } 

带弹簧configuration:

 @Configuration public class ProjectConfiguration { private static final Logger log = LoggerFactory.getLogger(ProjectConfiguration.class); @EventListener(ApplicationReadyEvent.class) public void doSomethingAfterStartup() { log.info("hello world, I have just started up"); } }