在Spring Boot启动后执行指定代码

作者:

在开发时有时候需要在整个应用开始运行时执行一些特定代码,比如初始化环境,准备测试数据等等。

在Spring中可以通过ApplicationListener来实现相关的功能,不过在配合Spring Boot使用时就稍微有些区别了。

创建ApplicationListener

这里以填充部分测试数据为例子,首先实现ApplicationStartup类。

publicclass ApplicationStartup implements ApplicationListener<ContextRefreshedEvent> {
@Override
publicvoidonApplicationEvent(ContextRefreshedEvent event) {
SourceRepository sourceRepository = event.getApplicationContext().getBean(SourceRepository.class);
Source je =new Source("justice_eternal吧","http://tieba.baidu.com/f?kw=justice_eternal");
sourceRepository.save(je);
}
}

这类并不会自动执行,需要我们注册。

硬编码注册

Spring Boot有一个类SpringApplication,这个类是Spring Boot的入口,包含所有的配置。

@Configuration
@ComponentScan
@EnableAutoConfiguration
publicclass WebApplication {
publicstaticvoidmain(String[] args) {
SpringApplication springApplication =new SpringApplication(WebApplication.class);
springApplication.addListeners(new ApplicationStartup());
springApplication.run(args);
}
}

硬编码的弊端在于无法区别环境,当我们需要部署应用到生产环境时需要修改代码。

配置文件

Spring Boot支持profiles模式,在application.properties中配置

spring.profiles.active=dev

然后在application-dev.properties中配置开发环境的参数。

增加一个配置来注册自定义的监听器

context.listener.classes=cn.acgmo.ApplicationStartup

评论

10 条对“在Spring Boot启动后执行指定代码”的回复

  1. Cherry

    这样确实可以执行代码,但是获取不到注入到spring中的service,没有办法调用service的方法

    1. htynkn

      可以获取的,文中的例子不就是获取一个Bean吗?因为可以获得ApplicationContext,所以整个上下文的东西都能够拿到

    2. June

      @Configuration
      @ComponentScan
      @EnableAutoConfiguration
      这3个 注解 什么意思 跟配置监听有关系吗

      1. htynkn

        这三个注解都是Spring Boot运行用的,这个和配置监听没有直接关系。

  2. June

    对了, 手动 添加注册时, addlistener 怎么添加一个 new 的对象 ,不是应该是even吗

  3. June

    (⊙o⊙)… 我知道了 , 看花了, 谢谢

  4. June

    spring:
    # profiles:
    # active: dev
    配置文件采用 yml模式, 能问一下 profile 模式 是什么。。。。 不明白

    1. htynkn

      Profile是Spring 3.1开始引入的。可以简单理解为理解为一种配置管理。

      比如我在本地开发用的是内存数据库,生产环境使用的是mysql。我就可以创建两个profile,一个是local,一个prod。然后本地开发active: dev,而生产环境active:prod。这样就可以快速切换配置。

  5. 匿名

    获取不到service的方法

    1. htynkn

      可以获取到service,只不过需要手动从event中取,不能用注解

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注