PK Creative празднует Китайский Новый год. Я участвую в "Творческом конкурсе Весеннего фестиваля". Подробности см.:Творческий конкурс "Праздник весны"
2022! Год тигра приближается ~ Давайте посмотрим, как в качестве заднего разработчика может учиться, как добавить новогоднюю атмосферу нашей идеей, как это:2022 happy
✏️springboot Custom Banner Метод
Способ 1: корневой путь banner.txt
Создайте новый файл banner.txt в разделе ресурсов и скопируйте в него содержимое баннера, и springboot прочитает файл и распечатает его при запуске.
Инструмент онлайн-генерации баннеров Spring Boot
Содержимое файла banner.txt следующее:
████ ████ ████ ████ ██
█░░░ █ █░░░██ █░░░ █ █░░░ █ ░██ ██████ ██████ ██ ██
░ ░█░█ █░█░ ░█░ ░█ ░██ ██████ ░██░░░██░██░░░██ ░░██ ██
███ ░█ █ ░█ ███ ███ ░██████ ░░░░░░██ ░██ ░██░██ ░██ ░░███
█░░ ░██ ░█ █░░ █░░ ░██░░░██ ███████ ░██████ ░██████ ░██
█ ░█ ░█ █ █ ░██ ░██ ██░░░░██ ░██░░░ ░██░░░ ██
░██████░ ████ ░██████░██████ ░██ ░██░░████████░██ ░██ ██
░░░░░░ ░░░░ ░░░░░░ ░░░░░░ ░░ ░░ ░░░░░░░░ ░░ ░░ ░░
Запустите проект Springboot для печати:
Метод 2: Пользовательское изображение баннера
Мы можем использовать файл изображения типа gif для печати баннера несколько раз при запуске Springboot и подготовить файл gif
- баннер1.gif:
- фейерверк.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 в классе.
👋 Напишите в конце
- Прежде всего, большое спасибо за то, что увидели это, эта статья будет размещена здесь, я желаю вам всемС новым годом!
- 👍🏻: Если у вас есть прибыль, пожалуйста, поставьте лайк и поддержите!
- ❤️: Любимые статьи для удобного просмотра!
- 💬: Обменивайтесь комментариями и развивайтесь друг с другом!