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

 更新时间:2018年12月02日 10:44:39   作者:banq  
在本文中您将学习如何挂钩应用程序引导程序生命周期并在Spring Boot启动时执行代码。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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存储库中找到完全可用的演示

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

相关文章

  • 详解springboot+mybatis-plue实现内置的CRUD使用详情

    详解springboot+mybatis-plue实现内置的CRUD使用详情

    这篇文章主要介绍了详解springboot+mybatis-plue实现内置的CRUD使用详情,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java Filter 过滤器详细介绍及实例代码

    Java Filter 过滤器详细介绍及实例代码

    Filter也称之为过滤器,它是Servlet技术中最实用的技术,本文章WEB开发人员通过Filter技术,对web服务器管理的所有web资源进行拦截,从而实现一些特殊的功能,本文章将向大家介绍Java 中的 Filter 过滤器,需要的朋友可以参考一下
    2016-12-12
  • Spring gateway配置Spring Security实现统一权限验证与授权示例源码

    Spring gateway配置Spring Security实现统一权限验证与授权示例源码

    这篇文章主要介绍了Spring gateway配置Spring Security实现统一权限验证与授权,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Spring实现一个简单的SpringIOC容器

    Spring实现一个简单的SpringIOC容器

    本篇文章主要介绍了Spring实现一个简单的SpringIOC容器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • IDEA 隐藏DEBUG日志的解决方法

    IDEA 隐藏DEBUG日志的解决方法

    IDEA 打印太多的DEBUG日志,看起来很烦,有没有办法隐藏日志,网上找了一圈,没有谁写的靠谱的,下面小编给大家分享下IDEA 如何隐藏DEBUG日志,需要的朋友可以参考下
    2022-09-09
  • Idea中如何修改项目的SVN地址

    Idea中如何修改项目的SVN地址

    这篇文章主要介绍了Idea中如何修改项目的SVN地址问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • RabbitMQ的安装和配置可视化界面的详细步骤

    RabbitMQ的安装和配置可视化界面的详细步骤

    这篇文章主要介绍了RabbitMQ的安装和配置可视化界面的详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • SpringBoot快速入门详解

    SpringBoot快速入门详解

    springboot提供了一种快速使用spring的方式,基于coc的思想,即约定大于配置,通过本文学习快速掌握springboot入门知识,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • SpringBoot中的Controller用法示例详解

    SpringBoot中的Controller用法示例详解

    Controller是SpringBoot里最基本的组件,他的作用是把用户提交来的请求通过对URL的匹配,分配给不同的接收器,再进行处理,然后向用户返回结果,这篇文章主要介绍了SpringBoot中的Controller用法,需要的朋友可以参考下
    2023-06-06
  • 使用Java开发实现OAuth安全认证的应用

    使用Java开发实现OAuth安全认证的应用

    这篇文章主要介绍了使用Java开发实现OAuth安全认证的应用的方法,OAuth安全认证经常出现于社交网络API应用的相关开发中,需要的朋友可以参考下
    2015-11-11

最新评论