如何在Spring Boot启动时运行定制的代码

所属分类: 软件编程 / java 阅读数: 25
收藏 0 赞 0 分享

Spring Boot会自动为我们做很多配置,但迟早你需要做一些自定义工作。在本文中,您将学习如何挂钩应用程序引导程序生命周期并在Spring Boot启动时执行代码。

1.执行bean初始化的方法

Spring启动应用程序后运行某些逻辑的最简单方法是将代码作为所选bean引导过程的一部分来执行。

只需创建一个类,将其标记为Spring组件,并将应用程序初始化代码放在带有@PostConstruct注释的方法中。理论上,您可以使用构造函数而不是单独的方法,但将对象的构造与其实际责任分开是一种很好的做法。

@Component
class AppInitializator {
 
  private static final Logger log = LoggerFactory.getLogger(AppInitializator.class);
 
  @PostConstruct
  private void init() {
    log.info("AppInitializator initialization logic ...");
    // ...
  }
 
}

还可以在主Spring Boot应用程序类中创建一个带有@PostConstruct注释的方法。不要忘记主类也是框架管理的组件。

@SpringBootApplication
public class InitDemoApplication {
 
  // ...
 
  @PostConstruct
  private void init() {
    log.info("InitDemoApplication initialization logic ...");
    // ...
  }
 
}

但这种解决方案感觉就像是一种解决方法而不是真正的解决方案 您可以以非常有限的方式控制Spring框架创建应用程序bean的顺序。如果我们想在创建所有bean之前或甚至在框架启动之前运行初始化逻辑,我们需要找到更好的东西。

2. Spring Boot启动挂钩

使用Spring Boot创建的应用程序的美妙之处在于,运行它们所需的唯一内容是Java Runtime Environment和命令行界面。无需外部工具或应用程序。它就像常规的Java SE程序一样运行。

作为每个Java程序,您都可以在入口应用程序类的静态main方法中开始执行此类应用程序。这就是你可以挂钩Spring Boot初始化过程的重点。

首先更改main方法中的代码,以将启动挂钩附加到单独的方法中。您应该在应用程序启动之前添加Spring Boot挂钩。

public static void main(String[] args) {
  SpringApplication application = new SpringApplication(InitDemoApplication.class);
  addInitHooks(application);
  application.run(args);
}
 
static void addInitHooks(SpringApplication application) {
  // TBD …
}

当Spring Boot应用程序启动时,它会在引导过程的各个步骤上发布几个事件。SpringApplication类的API公开了一个方法,我们可以使用该方法为这些事件添加侦听器。

这是一个在Spring上下文开始创建bean之前发布的事件上运行启动方法的示例:

static void addInitHooks(SpringApplication application) {
  application.addListeners((ApplicationListener<ApplicationEnvironmentPreparedEvent>) event -> {
    String version = event.getEnvironment().getProperty("java.runtime.version");
    log.info("Running with Java {}", version);
  });
}

根据事件类型,Spring传递给侦听器的对象可以让您访问几个有用的操作。在前面的示例中,我们读取了一些环境属性,但如果需要,我们也可以修改它。

以下是按启动时Spring Boot发布事件的顺序排序的可能事件列表:

  • ApplicationStartingEvent
  • ApplicationEnvironmentPreparedEvent
  • ApplicationContextInitializedEvent
  • ApplicationPreparedEvent
  • ApplicationStartedEvent
  • ApplicationReadyEvent

根据我的经验,最重要的事件是ApplicationEnvironmentPreparedEvent。在Spring Boot启动的这个时刻,尚未创建bean,但您可以访问整个应用程序配置。通常,这是运行一些自定义启动代码的最佳时机。

3.在启动时但没有运行Tomcat时运行代码

尽管Spring Boot设计人员在创建框架时考虑了构建胖JAR,但是一些开发人员仍然将Spring Boot应用程序部署到常规的servlet容器(如Tomcat)。如果是这种情况,那么前一段中的解决方案将无法发挥作用。除非有增加额外步骤。

如果将应用程序部署为常规WAR文件,则可能已经拥有SpringBootServlerInitializator的自定义实现。您只需稍微扩展它并添加初始化挂钩作为应用程序构建过程的一部分。

您可以轻松地重用我们在主应用程序类中创建的addInitHooks()方法。

public class InitDemoWarInitializer extends SpringBootServletInitializer {
 
  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    InitDemoApplication.addInitHooks(builder.application());
    return builder.sources(InitDemoApplication.class);
  }
 
}

结论

简而言之,在Spring Boot启动时运行代码有两个主要选项。最简单的一个设计用于初始化特定的bean。对于更多全局案例,该框架有一个专用解决方案,可以使用事件侦听器挂钩其生命周期。我们学习了如何实现和设置这样的监听器。

在Github存储库中找到完全可用的演示

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Collections工具类_动力节点Java学院整理

Collections工具类提供了大量针对Collection/Map的操作。这篇文章主要介绍了Collections工具类_动力节点Java学院整理,需要的朋友可以参考下
收藏 0 赞 0 分享

SpringMVC集成Swagger实例代码

本篇文章主要介绍了SpringMVC集成Swagger实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

十大常见Java String问题_动力节点Java学院整理

本文介绍Java中关于String最常见的10个问题,需要的朋友参考下吧
收藏 0 赞 0 分享

Java微信公众平台开发(13) 微信JSSDK中Config配置

这篇文章主要为大家详细介绍了Java微信公众平台开发第十三步,微信JSSDK中Config配置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java实现一个达达租车系统的步骤详解

这篇文章主要给大家介绍了利用Java实现一个达达租车系统的步骤,文中给出了详细的实现思路和示例代码,并在文末给出了完整的源码供大家学习下载,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

Java微信公众平台开发(14) 微信web开发者工具使用

这篇文章主要为大家详细介绍了Java微信公众平台开发第十四步,微信web开发者工具的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Spring Boot整合RabbitMQ实例(Topic模式)

Topic Exchange 转发消息主要是根据通配符。接下来通过本文给大家分享Spring Boot整合RabbitMQ实例(Topic模式),需要的朋友参考下吧
收藏 0 赞 0 分享

Java微信公众平台开发(15) 微信JSSDK的使用

这篇文章主要为大家详细介绍了Java微信公众平台开发第十五步,微信JSSDK的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java多线程的同步方法实例代码

这篇文章主要介绍了 java多线程的同步方法实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

spring boot整合RabbitMQ实例详解(Fanout模式)

这篇文章主要介绍了spring boot整合RabbitMQ的实例讲解(Fanout模式),非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多