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"); } }