资讯专栏INFORMATION COLUMN

Spring Boot启动及退出加载项

suosuopuo / 950人阅读

摘要:在一个初春的下午,甲跟我说,要在启动服务的时候,设置表自增的起始值。写完启动项,那么再把退出也说一下每一个都应该向注册一个钩子函数来确保能优雅地关闭。后面退出部分翻译地磕磕碰碰的,有不对的地方欢迎指正。原创不易,感谢支持。

在一个初春的下午,甲跟我说,要在Spring Boot启动服务的时候,设置表自增的起始值。
于是我用屁股想了一下,不就是在main方法里折腾嘛。
后来实际操作了一把,发现屁股被打了。

于是乎,找到官方文档(以2.1.4为例),找到这一段:

如果你需要在启动SpringApplication后执行一些具体的代码,你可以实现ApplicaitonRunner或者CommandLineRunner接口。两个接口都实现了一个工作方式相同的run方法,该方法仅会在SpringApplication.run(...)前执行。

唯一不同的是实现CommandLineRunner接口的run方法参数为String类型,而实现ApplicaitonRunnerrun方法的参数则是需要ApplicationArguments。官方文档中有个例子供参考。

如果有多个ApplicaitonRunner或者CommandLineRunner接口的实现存在启动顺序,则可以使用org.springframework.core.Ordered接口或者org.springframework.core.annotation.Order注解的形式来给他们排序。

由于我没有参数类型等的限制,所以用哪个接口都一样,写个跟官方不一样的,于是代码大概长这样:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class InstructionStart implements ApplicationRunner {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JdbcTemplate template;

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        String increment = "0";
        logger.info("初始化递增起始值为:{}", increment);
        template.execute("ALTER TABLE `table` AUTO_INCREMENT = " + increment);
    }
}

深刻的意识到脑子和屁股一样重要。

写完启动项,那么再把退出也说一下:

每一个SpringApplication都应该向JVM注册一个钩子函数来确保ApplicationContext能优雅地关闭。使所有的标准Spring生命周期回调(例如DisposableBean接口和@PreDestroy注解)都可用。

此外,如果你希望beans在调用SpringApplication.exit()时返回特定的退出代码,则可以实现org.springframework.boot.ExitCodeGenerator接口,这些退出代码会被传给System.exit()作为返回的状态码。官方还给了个例子,就是下面这个。

@SpringBootApplication
public class ExitCodeApplication {

    @Bean
    public ExitCodeGenerator exitCodeGenerator() {
        return () -> 42;
    }

    public static void main(String[] args) {
        System.exit(SpringApplication
                .exit(SpringApplication.run(ExitCodeApplication.class, args)));
    }
}

当然,ExitCodeGenerator也可以由异常来实现,当遇到一个这样的异常时,Sprin Boot会返回实现了getExitCode()方法的退出代码。

后面退出部分翻译地磕磕碰碰的,有不对的地方欢迎指正。

原创不易,感谢支持。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77478.html

相关文章

  • Spring Boot 参考指南(开发你的第一个Spring Boot应用程序)

    摘要:开发你的第一个应用程序本节描述如何开发一个简单的应用程序来突出了的一些关键特性,我们使用来构建这个项目,因为大多数都支持它。如果你希望分发一个自包含的应用程序,这可能会有问题。 11. 开发你的第一个Spring Boot应用程序 本节描述如何开发一个简单的Hello World! web应用程序来突出了Spring Boot的一些关键特性,我们使用Maven来构建这个项目,因为大多数...

    Cristalven 评论0 收藏0
  • 【从零入门系列-0】Spring Boot 之 Hello World

    摘要:结束语非常智能化,为开发者提供大量的默认配置细节,因此在的帮助下可以快速完成项目的运行,极简入门继续看从零入门系列程序结构设计说明 环境准备 java 开发环境 JDK1.8 安装 Maven 安装,jar自动依赖及包管理工具 IDE编辑器:IntelliJ IDEA 2019 说明 本项目为从零入门示例,目标为构建一个书籍增删改查管理页,力争记录一个无java基础的程序员学习笔...

    icyfire 评论0 收藏0
  • Spring Boot 参考指南(开发者工具)

    摘要:触发器文件可以手动更新,也可以使用插件进行更新。例如,要配置重新启动以始终使用触发器文件,你需要添加以下属性远程应用程序开发工具并不局限于本地开发,在远程运行应用程序时,还可以使用几个特性。 20. 开发者工具 Spring Boot包括一组额外的工具,这些工具可以使应用程序开发体验变得更加愉快,spring-boot-devtools模块可以包含在任何项目中,以提供额外的develo...

    APICloud 评论0 收藏0

发表评论

0条评论

suosuopuo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<