【好奇害死猫】SpringApplication详解

本文详述了SpringApplication的三种启动方法,包括临时新建demo、方法二和使用SpringApplicationBuilder。此外,文章介绍了如何定制启动banner以及SpringBoot的事件监听机制,包括ApplicationListener接口的使用和事件触发顺序。最后,提到了Springboot的web环境信息以及Application接口和CommandLineRunner接口的应用。

一、SpringApplication的几种常用的方法

1、临时新建了一个demo

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

现在的springboot用法如上。new了一个demoapp对象+参数

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

继续,开始真正的执行run方法。
在这里插入图片描述

2、方法二

我们发现方法一,语法很简单就可以启动一个项目,但是简单是有简单的代价的。就是扩展性并不是很好我们想要在其基础上添加一些东西就比较困难。比如我们想添加ba

由于不太明确“还是不对”具体所指的内容,推测可能是之前提供的座位分配代码存在问题。以下是对代码可能存在问题的进一步排查与优化: ### 代码可能存在的问题及解决办法 1. **输入验证方面**:虽然之前对部分输入进行了验证,但可以进一步完善,确保输入合法。 2. **座位分配逻辑**:检查是否准确地按照先相邻座位、后最小编号空座的规则进行分配。 3. **座位编号显示**:确认座位编号(如 1A、2B 等)是否正确显示。 ### 优化后的代码 ```c #include <stdio.h> #define ROWS 20 #define SEATS_PER_ROW 5 // 检查一排中是否有连续的空座位 int check_consecutive_empty_seats(int seats[ROWS][SEATS_PER_ROW], int row, int num_seats) { for (int i = 0; i <= SEATS_PER_ROW - num_seats; i++) { int consecutive = 1; for (int j = 0; j < num_seats; j++) { if (seats[row][i + j]) { consecutive = 0; break; } } if (consecutive) { return i; } } return -1; } // 分配座位 void allocate_seats(int seats[ROWS][SEATS_PER_ROW], int num_seats) { // 先尝试同一排相邻座位 for (int i = 0; i < ROWS; i++) { int start_index = check_consecutive_empty_seats(seats, i, num_seats); if (start_index != -1) { for (int j = 0; j < num_seats; j++) { seats[i][start_index + j] = 1; char seat_letter; switch (start_index + j) { case 0: seat_letter = 'A'; break; case 1: seat_letter = 'B'; break; case 2: seat_letter = 'C'; break; case 3: seat_letter = 'D'; break; case 4: seat_letter = 'F'; break; } printf("%d%c ", i + 1, seat_letter); } printf("\n"); return; } } // 若没有相邻座位,分配最小编号空座 int seats_allocated = 0; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < SEATS_PER_ROW; j++) { if (!seats[i][j]) { seats[i][j] = 1; char seat_letter; switch (j) { case 0: seat_letter = 'A'; break; case 1: seat_letter = 'B'; break; case 2: seat_letter = 'C'; break; case 3: seat_letter = 'D'; break; case 4: seat_letter = 'F'; break; } printf("%d%c ", i + 1, seat_letter); seats_allocated++; if (seats_allocated == num_seats) { printf("\n"); return; } } } } // 若没有足够的座位 if (seats_allocated < num_seats) { printf("没有足够的座位供分配,请减少购票张数。\n"); } } int main() { int seats[ROWS][SEATS_PER_ROW] = {0}; int num_requests; // 验证购票次数输入 while (1) { printf("请输入购票次数: "); if (scanf("%d", &num_requests) != 1 || num_requests < 1) { printf("购票次数必须为正整数,请重新输入。\n"); while (getchar() != '\n'); // 清除输入缓冲区 } else { break; } } for (int i = 0; i < num_requests; i++) { int num_seats; // 验证每次购票张数输入 while (1) { printf("请输入第 %d 次购票的张数 (最多 5 张): ", i + 1); if (scanf("%d", &num_seats) != 1 || num_seats < 1 || num_seats > 5) { printf("每次购票张数必须在 1 到 5 张之间,请重新输入。\n"); while (getchar() != '\n'); // 清除输入缓冲区 } else { break; } } allocate_seats(seats, num_seats); } return 0; } ``` ### 代码解释 1. **输入验证**:在 `main` 函数中,使用 `while` 循环和 `scanf` 的返回值来验证用户输入的购票次数和每次购票张数是否为合法的正整数。 2. **座位分配**:`allocate_seats` 函数先尝试分配同一排的相邻座位,若无法分配则分配最小编号的空座。 3. **错误处理**:当没有足够的座位供分配时,会给出相应的提示信息。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌路Molu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值