欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Boot启动及退出加载项的方法

程序员文章站 2024-02-24 20:16:04
在一个初春的下午,甲跟我说,要在spring boot启动服务的时候,设置表自增的起始值。 于是我用屁股想了一下,不就是在main方法里折腾嘛。 后来实际操作了...

在一个初春的下午,甲跟我说,要在spring boot启动服务的时候,设置表自增的起始值。

于是我用屁股想了一下,不就是在main方法里折腾嘛。

后来实际操作了一把,发现屁股被打了。

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

Spring Boot启动及退出加载项的方法

如果你需要在启动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);
  }
}

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

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

Spring Boot启动及退出加载项的方法

每一个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()方法的退出代码。

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

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