Пришло время сделать вашу программу немного ⭐Китайским Новым годом✨

Spring Boot Java задняя часть
Пришло время сделать вашу программу немного ⭐Китайским Новым годом✨

PK Creative празднует Китайский Новый год. Я участвую в "Творческом конкурсе Весеннего фестиваля". Подробности см.:Творческий конкурс "Праздник весны"

2022! Год тигра приближается ~ Давайте посмотрим, как в качестве заднего разработчика может учиться, как добавить новогоднюю атмосферу нашей идеей, как это:2022 happy

image.png

✏️springboot Custom Banner Метод

Способ 1: корневой путь banner.txt

Создайте новый файл banner.txt в разделе ресурсов и скопируйте в него содержимое баннера, и springboot прочитает файл и распечатает его при запуске.

Инструмент онлайн-генерации баннеров Spring Boot

image.png

Содержимое файла banner.txt следующее:

  ████   ████   ████   ████    ██                                        
 █░░░ █ █░░░██ █░░░ █ █░░░ █  ░██                ██████  ██████   ██   ██
░    ░█░█  █░█░    ░█░    ░█  ░██       ██████  ░██░░░██░██░░░██ ░░██ ██ 
   ███ ░█ █ ░█   ███    ███   ░██████  ░░░░░░██ ░██  ░██░██  ░██  ░░███  
  █░░  ░██  ░█  █░░    █░░    ░██░░░██  ███████ ░██████ ░██████    ░██   
 █     ░█   ░█ █      █       ░██  ░██ ██░░░░██ ░██░░░  ░██░░░     ██    
░██████░ ████ ░██████░██████  ░██  ░██░░████████░██     ░██       ██     
░░░░░░  ░░░░  ░░░░░░ ░░░░░░   ░░   ░░  ░░░░░░░░ ░░      ░░       ░░      

Запустите проект Springboot для печати:

image.png

Метод 2: Пользовательское изображение баннера

Мы можем использовать файл изображения типа gif для печати баннера несколько раз при запуске Springboot и подготовить файл gifimage.png

  • баннер1.gif:

banner1.gif

  • фейерверк.gif:

fireworks.gif

Настроить путь к gif

spring:
  banner:
    image:
      location: classpath:myBanner/banner1.gif
#      location: classpath:myBanner/fireworks.gif

Эффект запуска fireworks.gif:

  省略。。。
   
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8@@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@.8@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@*@@@#@@@o8 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.   @@8@o#:.@@#:@o#@#@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@o@#o@@@*@ @@ :.@8 @8@@ @#8@@**o@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@88@@@*@@ &@* @#@:8..8o*@: o@ @  # @@:@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@.@@@@o@ :@ .:@ *8o .8o8@o@8 o@o  #:@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@ 8#o:@...o*. o#@ :@o*@  @8@ @88 *@ @@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@.@@@8@o@ @:#* :o#o.oo. *..:#.:.@@@@@@@8:@@ @@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@#@  #@@@8@88::8:.:*:o.. 8  @.o: : o @@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@ @@@&o@@@    .8 o8o&.:8.o: 8.:8&@ ..@:  @@#@@@@*@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@&@@@@@@@8 8::#88* 88 . o. .:#@*o : @@ @@@@:@ @@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@8@.@@*@:   :o#8 ...o*.:: : #*@.@ .:@#8 &@@o.@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@ :#@.#.@8oo8 :o88. #:8o   :: * 8*@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@*# @8o @: . oo .o.o*o @8o 8  @*:# @@#@*@@@*@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@:@@#@@@#::@@* ##@@ :o # o*@.:8::.@:o:@8:@@ o.@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@ @@@@@@@@@.@#  #8:#.:8  #8 .o# 8o  :@  8@ 88@#*#@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@8@@@@@@ @@8@ .@8o@*@@@8@.@ @@@:8@#@*@@@@ @..@ @@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@:@@@@@&@: 8.:@ 88@@@# @ .@@ @@#@@@88@ @8@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@ .@ o@:@8o@@@ @##.8  o@@:@@#@@.@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@8@#@@@@@@&@@@@   o8 @@@*@@o@.@8@o .@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@&@@@&@ @  @8@#.o&@@8 @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@:8:@8@. #@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  ████   ████   ████   ████    ██
 █░░░ █ █░░░██ █░░░ █ █░░░ █  ░██                ██████  ██████   ██   ██
░    ░█░█  █░█░    ░█░    ░█  ░██       ██████  ░██░░░██░██░░░██ ░░██ ██
   ███ ░█ █ ░█   ███    ███   ░██████  ░░░░░░██ ░██  ░██░██  ░██  ░░███
  █░░  ░██  ░█  █░░    █░░    ░██░░░██  ███████ ░██████ ░██████    ░██
 █     ░█   ░█ █      █       ░██  ░██ ██░░░░██ ░██░░░  ░██░░░     ██
░██████░ ████ ░██████░██████  ░██  ░██░░████████░██     ░██       ██
░░░░░░  ░░░░  ░░░░░░ ░░░░░░   ░░   ░░  ░░░░░░░░ ░░      ░░       ░░

2022-01-10 11:23:15.146  INFO 109632 --- [           main] com.ljw.Application                      : Starting Application using Java 1.8.0_202 on LAPTOP-HTA2F6RV with PID 109632 (E:\project\private\github\java-guide\banner-spring-boot\target\classes started by ljw in E:\project\private\github\java-guide)
2022-01-10 11:23:15.148  INFO 109632 --- [           main] com.ljw.Application                      : No active profile set, falling back to default profiles: default
2022-01-10 11:23:15.436  INFO 109632 --- [           main] com.ljw.Application                      : Started Application in 3.027 seconds (JVM running for 3.643)

Process finished with exit code 0

Эффект запуска banner1.gif:

  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@:                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*              #@@@@@   @@@@@.   @@@@@    @@@@@                @@@@@@
  @@@@@@@*              @   #@  @@   o@& #    @@  @    @@               @@@@@@
  @@@@@@@*                 @@8 @@     @@    @@@      @@@                @@@@@@
  @@@@@@@*              @@@    &@     @@  @@&     &@@                   @@@@@@
  @@@@@@@*             #@       @@   @@  @@       @#                    @@@@@@
  @@@@@@@*              @@@@@@   o@@@#   @@@@@@@  @@@@@@:               @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@#.............................................................*@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@



  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@:                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*           @@                                                 @@@@@@
  @@@@@@@*           @@                      .                          @@@@@@
  @@@@@@@*           @@@@@@*  @@@@@@ @@@@@@  @@@@@@ @@   @@:            @@@@@@
  @@@@@@@*           @@   @@ @@  *@. @@   @@ @@   @* @@.#@8             @@@@@@
  @@@@@@@*           @@   @@ @@   @& @@   @@ @@  #@   @@@@              @@@@@@
  @@@@@@@*           @@   @@  @@@@@@ @@@@@o  @@@@@     @@               @@@@@@
  @@@@@@@*                           @@      @@       @@                @@@@@@
  @@@@@@@*                           :@      @#       @                 @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@#.............................................................*@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@



  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@:                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*       @@          @#               @@            .@o         @@@@@@
  @@@@@@@*       @@         @@@@@@@@@@@       @@       @@@@@@@@@@@@@    @@@@@@
  @@@@@@@*   @@88888888@@  @@    @@     &@@@@@@@@@@@@@      .@o         @@@@@@
  @@@@@@@*   @@@@@@@@@:@.  @@@@@@@@@@@@       @@        @@@@@@@@@@@     @@@@@@
  @@@@@@@*   @@   @@@@@@    @@   @@          @@@@       @@@@@@@@@@@     @@@@@@
  @@@@@@@*  *@o @@@@@@    @@@@@@@@@@@@@@    @@  @@@     @@       @@     @@@@@@
  @@@@@@@*  @@ @@@  @@ @@        @@      @@@@    *@@@8  @@@@@@@@@@@     @@@@@@
  @@@@@@@*     @     *o          @@      .          #   @@       @@     @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@#.............................................................*@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@



  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@:                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*       @@             @8             @@              @@ @     @@@@@@
  @@@@@@@*       @@             @8        @@.  @@       @@@@@@@@@@@@    @@@@@@
  @@@@@@@*   @@88888888@@  @@888888888@* @@@@@@@@@@@@.  @      @@       @@@@@@
  @@@@@@@*   @@@@@@@@@:@.  @@#@@@@@@8@8 #@8    @@       @  @8  #@ @@    @@@@@@
  @@@@@@@*   @@   @@@@@@   @@   @@@@@@    *@@@@@@@@@@   @ @@@@@.@@@     @@@@@@
  @@@@@@@*  *@& @@@@@@     @@ :@@@@@.          @@      #@.@@@@ .@@ @    @@@@@@
  @@@@@@@*  @@ @@@  @@ @@ @@*.@@  .@&*@. @@@@@@@@@@@@@ @@:@@@@@@@@&@.   @@@@@@
  @@@@@@@*     @     *o    # :.     o*                        o   @.    @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@*                                                              @@@@@@
  @@@@@@@#.............................................................*@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  ████   ████   ████   ████    ██
 █░░░ █ █░░░██ █░░░ █ █░░░ █  ░██                ██████  ██████   ██   ██
░    ░█░█  █░█░    ░█░    ░█  ░██       ██████  ░██░░░██░██░░░██ ░░██ ██
   ███ ░█ █ ░█   ███    ███   ░██████  ░░░░░░██ ░██  ░██░██  ░██  ░░███
  █░░  ░██  ░█  █░░    █░░    ░██░░░██  ███████ ░██████ ░██████    ░██
 █     ░█   ░█ █      █       ░██  ░██ ██░░░░██ ░██░░░  ░██░░░     ██
░██████░ ████ ░██████░██████  ░██  ░██░░████████░██     ░██       ██
░░░░░░  ░░░░  ░░░░░░ ░░░░░░   ░░   ░░  ░░░░░░░░ ░░      ░░       ░░

2022-01-10 11:13:36.266  INFO 81288 --- [           main] com.ljw.Application                      : Starting Application using Java 1.8.0_202 on LAPTOP-HTA2F6RV with PID 81288 (E:\project\private\github\java-guide\banner-spring-boot\target\classes started by ljw in E:\project\private\github\java-guide)
2022-01-10 11:13:36.268  INFO 81288 --- [           main] com.ljw.Application                      : No active profile set, falling back to default profiles: default
2022-01-10 11:13:36.572  INFO 81288 --- [           main] com.ljw.Application                      : Started Application in 4.772 seconds (JVM running for 5.362)

Process finished with exit code 0

Здесь файл gif и файл banner.txt печатаются одновременно, видно, что печать gif печатается в соответствии с номером кадра гифки.

☀️ Баннер для анализа исходного кода SpringBoot

Разберем как springboot управляет печатью баннеров, класс запуска SpringBoot, жмем run для входа и выходим для просмотра

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
    return run(new Class[]{primarySource}, args);
}

Вот новый класс ресурсов класса

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    return (new SpringApplication(primarySources)).run(args);
}

Возвращается новый класс запуска SpringApplication, введите этот конструктор

public SpringApplication(Class<?>... primarySources) {
    this((ResourceLoader)null, primarySources);
}

Здесь все еще вызывается собственный конструктор

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    this.sources = new LinkedHashSet();
    //这里启动时指定了banner的模式
    this.bannerMode = Mode.CONSOLE;
    this.logStartupInfo = true;
    this.addCommandLineProperties = true;
    this.addConversionService = true;
    this.headless = true;
    this.registerShutdownHook = true;
    this.additionalProfiles = Collections.emptySet();
    this.isCustomEnvironment = false;
    this.lazyInitialization = false;
    this.applicationContextFactory = ApplicationContextFactory.DEFAULT;
    this.applicationStartup = ApplicationStartup.DEFAULT;
    this.resourceLoader = resourceLoader;
    Assert.notNull(primarySources, "PrimarySources must not be null");
    this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    this.bootstrapRegistryInitializers = new ArrayList(this.getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
    this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
    this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = this.deduceMainApplicationClass();
}

Конструктор по умолчанию инициализирует некоторые свойства.Здесь мы можем вызвать соответствующий сеттер при запуске для сброса свойств.Инициализируется режим баннера.Утверждение: this.bannerMode = Mode.CONSOLE; Давайте нажмем, чтобы увидеть этот класс перечисления

@FunctionalInterface
public interface Banner {
    void printBanner(Environment environment, Class<?> sourceClass, PrintStream out);

    public static enum Mode {
        OFF,
        CONSOLE,
        LOG;

        private Mode() {
        }
    }
}

Баннер определяет три режима, и вы можете знать эффект от буквального значения

  • OFF: Закрыть баннер
  • CONSOLE: консольный вывод
  • LOG: вывод журнала

Прежде чем вернуться назад, бегом посмотреть, что делается после инициализации

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    return (new SpringApplication(primarySources)).run(args);
}

Мы знаем, что вызов new SpringApplication(primarySources) вызовет конструктор, инициализирует некоторые свойства по умолчанию, а затем вызовет метод run(args), давайте нажмем run, чтобы увидеть

public ConfigurableApplicationContext run(String... args) {
    long startTime = System.nanoTime();
    DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
    ConfigurableApplicationContext context = null;
    this.configureHeadlessProperty();
    SpringApplicationRunListeners listeners = this.getRunListeners(args);
    listeners.starting(bootstrapContext, this.mainApplicationClass);

    try {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
        this.configureIgnoreBeanInfo(environment);
        //这里很明显是打印banner
        Banner printedBanner = this.printBanner(environment);
        context = this.createApplicationContext();
        context.setApplicationStartup(this.applicationStartup);
        this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
        this.refreshContext(context);
        this.afterRefresh(context, applicationArguments);
        Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);
        if (this.logStartupInfo) {
            (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), timeTakenToStartup);
        }

        listeners.started(context, timeTakenToStartup);
        this.callRunners(context, applicationArguments);
    } catch (Throwable var12) {
        this.handleRunFailure(context, var12, listeners);
        throw new IllegalStateException(var12);
    }

    try {
        Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);
        listeners.ready(context, timeTakenToReady);
        return context;
    } catch (Throwable var11) {
        this.handleRunFailure(context, var11, (SpringApplicationRunListeners)null);
        throw new IllegalStateException(var11);
    }
}

Banner printBanner = this.printBanner(environment) Заявление печатается баннер, продолжаем разбираться по пунктам

private Banner printBanner(ConfigurableEnvironment environment) {
   //判断是否打印
   if (this.bannerMode == Mode.OFF) {
       return null;
   } else {
       ResourceLoader resourceLoader = this.resourceLoader != null ? this.resourceLoader : new DefaultResourceLoader((ClassLoader)null);
       //创建一个打印对象
       SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter((ResourceLoader)resourceLoader, this.banner);
       //根据模式判断是否打印控制台还是日志
       return this.bannerMode == Mode.LOG ? bannerPrinter.print(environment, this.mainApplicationClass, logger) : bannerPrinter.print(environment, this.mainApplicationClass, System.out);
   }
}

Вот, чтобы судить о режиме вывода баннера, режим - консоль, нажмите здесь, чтобы проверить bannerPrinter.print()

Banner print(Environment environment, Class<?> sourceClass, Log logger) {
    //获取一个Banner
    Banner banner = this.getBanner(environment);

    try {
        logger.info(this.createStringFromBanner(banner, environment, sourceClass));
    } catch (UnsupportedEncodingException var6) {
        logger.warn("Failed to create String for banner", var6);
    }

    return new SpringApplicationBannerPrinter.PrintedBanner(banner, sourceClass);
}

Вот утверждение: Banner banner = this.getBanner(environment); Получите баннер в соответствии с окружением, нажмите на него, чтобы увидеть

private Banner getBanner(Environment environment) {
    SpringApplicationBannerPrinter.Banners banners = new SpringApplicationBannerPrinter.Banners();
    //这里获取一个图片banner
    banners.addIfNotNull(this.getImageBanner(environment));
     //这里获取一个文本banner
    banners.addIfNotNull(this.getTextBanner(environment));
    if (banners.hasAtLeastOneBanner()) {
    //至少有一个banner就返回
        return banners;
    } else {
        //这里直接返回了springboot默认的banner
        return this.fallbackBanner != null ? this.fallbackBanner : DEFAULT_BANNER;
    }
}

Мы нажимаем метод, чтобы получить изображение: banners.addIfNotNull(this.getImageBanner(environment));

private Banner getImageBanner(Environment environment) {
    String location = environment.getProperty("spring.banner.image.location");
    if (StringUtils.hasLength(location)) {
        Resource resource = this.resourceLoader.getResource(location);
        return resource.exists() ? new ImageBanner(resource) : null;
    } else {
        //这里定义了查看图片类型
        String[] var3 = IMAGE_EXTENSION;
        int var4 = var3.length;

        for(int var5 = 0; var5 < var4; ++var5) {
            String ext = var3[var5];
            Resource resource = this.resourceLoader.getResource("banner." + ext);
            if (resource.exists()) {
                //我们自定义了配置就会立刻返回,只会加载一个banner
                return new ImageBanner(resource);
            }
        }

        return null;
    }
}

Здесь видно, что будут загружены параметры spring.banner.image.location нашего файла конфигурации среды, и будет загружен только один баннер.Мы видим типы изображений следующим образом:

static final String[] IMAGE_EXTENSION = new String[]{"gif", "jpg", "png"};

Картинки гиф анимации можно настроить, и заказы есть, и их возвращают.

Проверяем текстовый баннер: banners.addIfNotNull(this.getTextBanner(environment)); заходим и проверяем

private Banner getTextBanner(Environment environment) {
    String location = environment.getProperty("spring.banner.location", "banner.txt");
    Resource resource = this.resourceLoader.getResource(location);

    try {
        if (resource.exists() && !resource.getURL().toExternalForm().contains("liquibase-core")) {
            return new ResourceBanner(resource);
        }
    } catch (IOException var5) {
    }

    return null;
}

Он также определяется по умолчанию в среде, в которой клавиша конфигурации является Spring.Banner.location, и имя значения: banner.txt, пока мы поставьте Banner.txt в классе.

👋 Напишите в конце

  • Прежде всего, большое спасибо за то, что увидели это, эта статья будет размещена здесь, я желаю вам всемС новым годом!
  • 👍🏻: Если у вас есть прибыль, пожалуйста, поставьте лайк и поддержите!
  • ❤️: Любимые статьи для удобного просмотра!
  • 💬: Обменивайтесь комментариями и развивайтесь друг с другом!