专栏首页Linyb极客之路在Spring Boot启动时运行定制的代码

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

}

4、demo代码链接

https://github.com/danielolszewski/blog/tree/master/spring-boot-init-demo

结论

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

本文分享自微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Spring Boot开发的10个免费开源项目

    本文推荐一些使用Spring Boot开发的免费开源项目,可用于学习目的,能够查看源代码并获得真实项目的实践经验。除了Spring Boot,您还将学习Spri...

    lyb-geek
  • Java开发人员应该知道的前5个Spring Boot特性

    通过使用Spring Boot Starter POM或入门依赖项功能,您只需在pom.xml中添加spring-boot-starter-web依赖项即可...

    lyb-geek
  • 使用lazyInit缩短Spring Boot启动时间

    Spring Boot可以进行有助于相关针对项目的设置,包括最常见的默认设置和随时可用的配置,这无疑是很棒的,因为它节省了宝贵的时间 然而,对于框架的新手来说,...

    lyb-geek
  • 2019年Spring Boot面试都问了什么?快看看这22道面试题!

    多年来,随着新功能的增加,spring 变得越来越复杂。访问spring官网页面,我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。如...

    程序员追风
  • 2019年Spring Boot不可错过的22道面试题!

    原文链接:https://blog.csdn.net/Design407/article/details/103263...

    用户1161110
  • Spring Boot系列--面试题和参考答案

    答:多年来,随着新功能的增加,spring变得越来越复杂。只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同...

    用户4143945
  • springcloud(一):Spring Cloud简介

    研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud。在使用了一段时间后发现Spring...

    Java架构师历程
  • Spring -> Spring Boot > Spring Cloud

    想学习就必须得知道什么是微服务,什么是Spring Boot,什么是Spring Cloud,以及两者之间有什么关系?

    Dawnzhang
  • 苹果推出突破性新技术,使开发人员更加轻松快捷地创建应用

    苹果软件工程高级副总裁Craig Federighi表示,“新应用程序开发技术使开发人员能够更快,更轻松,更有趣地开发应用程序,这代表着在所有苹果平台上创建应用...

    AiTechYun
  • 2020 年 Spring Cloud 发布了,更新线图!

    来源 | oschina.net/news/112295/spring-cloud-roadmap-2020

    搜云库技术团队

扫码关注云+社区

领取腾讯云代金券