- 博客(167)
- 收藏
- 关注
原创 87、后会有期
**原理**:支持从多种来源读取配置,如`application.properties`、`application.yml`、环境变量、命令行参数等。- 使用`application-{profile}.properties`或`application-{profile}.yml`配置不同环境的参数。- **原理**:提供了一系列监控和管理端点,用于查看应用的健康状态、度量信息、环境变量等。- **原理**:根据项目的依赖和配置,自动配置Spring应用程序所需的Bean。
2025-07-04 07:52:25
280
原创 86、原理解析-自定义事件监听组件
1. **创建监听器类:** 实现 `ApplicationListener` 接口,泛型指定监听的事件类型,实现 `onApplicationEvent` 方法。2. **发布事件:** 注入 `ApplicationEventPublisher`,调用 `publishEvent` 方法发布事件。1. **创建监听器方法:** 在组件类中使用 `@EventListener` 注解标记方法,指定监听的事件类型。**方式二:实现 `ApplicationListener` 接口**// 业务逻辑...
2025-07-04 07:51:44
408
原创 85、原理解析-SpringBoot完整启动过程
应用程序的主类上标有`@SpringBootApplication`注解,该注解是`@Configuration`、`@EnableAutoConfiguration`和`@ComponentScan`的组合。- **加载初始化器和监听器**:从`META-INF/spring.factories`中加载`ApplicationContextInitializer`和`ApplicationListener`。- 从`META-INF/spring.factories`中加载自动配置类,按需启用。
2025-07-02 00:19:47
312
原创 84、原理解析-SpringApplication创建初始化流程
84、原理解析-SpringApplication初始化流程# SpringApplication创建初始化流程原理解析`SpringApplication`的创建和初始化是Spring Boot应用启动的关键步骤,主要包括以下过程:## 1. 创建SpringApplication实例### 1.1 调用构造函数- 当调用`SpringApplication.run()`方法时,会先创建`SpringApplication`实例。- 构造函数接受主配置类(通常标有`@SpringBootApplicati
2025-07-02 00:18:43
368
原创 83、高级特性-自定义starter细节
分别打包两个模块,将`xxx-spring-boot-starter`发布到Maven仓库或本地仓库。#### **自动配置模块**:`xxx-spring-boot-autoconfigure`#### **Starter模块**:`xxx-spring-boot-starter`- 自动配置模块:`xxx-spring-boot-autoconfigure`- Starter模块:`xxx-spring-boot-starter`private String message = "默认消息";
2025-06-27 23:01:56
268
原创 82、高级特性-配置加载优先级
**`bootstrap`配置文件**:`bootstrap.properties`和`bootstrap.yml`用于配置Spring Cloud Config等,加载顺序在`application`系列文件之前。- **打包外部的`application-{profile}.properties`或`application-{profile}.yml`**- **`application-{profile}.properties`或`application-{profile}.yml`**
2025-06-27 22:59:45
382
原创 81、高级特性-Profile环境切换
在Spring Boot应用程序中,`Profile`机制用于在不同环境(如开发、测试、生产)下使用不同的配置,实现配置的灵活切换。对于多个环境共有的配置,可以放在`application.yml`中,环境特定的配置会覆盖通用配置。通过`Profile`机制,可以轻松地在不同环境之间切换配置,提高应用程序的部署和维护效率。其中,`{profile}`是环境名称,如`dev`、`test`、`prod`等。- `application-dev.yml`:开发环境配置。81、高级特性-Profile环境切换。
2025-06-26 16:56:47
502
原创 80、指标监控-Boot Admin Server
Boot Admin Server是一个功能强大的监控工具,为Spring Boot应用提供了全面的监控和管理功能,提高了系统的可维护性和可靠性。- 查看HTTP端点信息,如健康检查`/health`、环境变量`/env`、日志级别`/loggers`等。- 展示应用的配置属性,如`application.properties`中的参数。- 实时查看和修改应用的日志级别(如`DEBUG`、`INFO`、`WARN`)。- 负责收集应用的状态、指标、日志等信息,并发送给Admin Server。
2025-06-26 16:55:38
582
原创 79、指标监控-定制Endpoint
**自定义监控指标**:通过创建自定义Endpoint,您可以监控应用程序中的特定业务逻辑或性能指标,例如某个方法的调用次数、处理时间等。- `@WriteOperation`:用于定义写入操作,访问路径为`/actuator/custom`,支持POST请求。- **扩展监控范围**:除了系统默认提供的监控指标,定制Endpoint可以让您监控更多维度的数据,满足个性化需求。- `@Endpoint(id = "custom")`:定义了一个名为`custom`的Endpoint。
2025-06-25 07:47:03
430
原创 78、指标监控-开启与禁用
编辑 Pod Monitor YAML,将 `enabled` 设为 `false` 或删除配置。**1. 应用程序内置监控(如 Tetragon)**- **参考文档:** 查看官方文档获取详细配置说明。3. **验证禁用状态,确认指标不再被采集。4. **验证监控状态,确认指标正常采集。- **谨慎操作:** 避免影响系统正常运行。- **备份数据:** 禁用前备份重要数据。- **启用 Pod Monitor:**- **停用 Pod Monitor:**3. **配置监控目标,指定采集规则。
2025-06-25 07:46:26
554
原创 77、指标监控-SpringBoot Actuator与Endpoint
Spring Boot Actuator 是 Spring Boot 提供的一个监控和管理生产环境的模块,它通过暴露一系列的 **HTTP 或 JMX 端点(Endpoint)**,使开发者可以实时了解应用程序的运行状态、性能指标、配置信息等,从而方便地进行监控、管理和故障排除。**指标端点**,提供应用程序的各项性能指标,如内存使用情况、CPU 利用率、HTTP 请求统计等。**健康检查端点**,显示应用程序的健康状态,包括依赖的健康情况(如数据库、消息队列等)。return "这是自定义端点的信息";
2025-06-24 09:23:55
392
原创 76、单元测试-参数化测试
**输入验证**:测试不同参数类型(如字符串、数字、特殊字符)和边界值(如最大值、最小值、空值)对被测方法的影响。- **数据驱动测试**:将测试数据参数化,测试逻辑保持不变,通过不同的数据输入验证被测方法的正确性。- **测试用例生成**:根据参数化数据自动生成多个测试用例,每个用例对应一组特定的输入参数。- **多环境测试**:测试同一方法在不同环境(如开发、测试、生产)下的行为一致性。- **异常处理**:验证方法在异常输入下的容错能力,如无效数据、格式错误等。76、单元测试-参数化测试。
2025-06-24 09:22:41
304
原创 75、单元测试-嵌套测试
嵌套测试通过`@Nested`注解,将测试类定义为外部类的**内部类**,形成嵌套结构。- **生命周期方法**:嵌套类可以有自己的`@BeforeEach`和`@AfterEach`方法,但不会继承外部类的这些方法。**嵌套测试**是JUnit 5提供的一种功能,允许将测试类组织成层次结构,提升测试代码的可读性和可维护性。- **非静态内部类**:`@Nested`类必须是非静态的,以便访问外部类的成员。- **执行顺序**:嵌套测试的执行顺序是从外到内,但同层级的嵌套类之间顺序不确定。
2025-06-23 12:46:28
518
原创 74、单元测试-前置条件
如果前置条件不满足,测试用例将不会执行,以避免在无效的环境下测试导致错误的测试结果。- **明确测试范围**:清晰地定义测试用例的适用条件,帮助测试人员和开发人员理解测试的背景。- **合理使用**:前置条件应仅用于检查测试环境和外部依赖,避免用于验证被测代码的逻辑。- **筛选测试环境**:确保测试在合适的环境下进行,例如特定的配置、依赖服务等。- **提高测试效率**:避免在不满足前提条件时执行测试,减少不必要的资源消耗。- **明确提示**:在前置条件不满足时,提供清晰的提示信息,方便排查问题。
2025-06-23 12:45:21
330
原创 73、单元测试-断言机制
3. **提高代码质量**:促使开发者在编写代码时考虑各种边界条件和异常情况,提升代码的健壮性和可靠性。- **合理设置预期值**:确保预期值准确反映代码的正确行为,避免因预期值错误导致测试失败。2. **错误定位**:当断言失败时,会明确指出错误的位置和原因,帮助开发者快速定位问题。- **避免过度断言**:过多的断言会增加测试的复杂性,应专注于关键逻辑和边界条件。- **处理断言失败**:当断言失败时,及时分析原因并进行修复,不要忽略失败的测试。// 断言方法会抛出指定的异常。
2025-06-22 15:37:05
419
原创 72、单元测试-常用测试注解
在单元测试中,常用的测试注解可以帮助组织和管理测试代码,提高测试的可读性和可维护性。- 需要配合`@ValueSource`、`@CsvSource`等注解提供参数数据。- 与JUnit的`@BeforeClass`类似,在所有测试方法执行前运行一次。- 与JUnit的`@AfterClass`类似,在所有测试方法执行后运行一次。- 与JUnit的`@Test`类似,标记一个方法为测试方法。- 可以设置`priority`参数来指定测试方法的执行顺序。- 用于参数化测试,允许测试方法接收不同的参数值。
2025-06-22 15:36:11
540
原创 71、单元测试-Junit5简介
提供 `@ParameterizedTest` 注解,结合 `@ValueSource`、`@CsvSource`、`@MethodSource` 等注解定义参数来源。- 提供丰富的注解,如 `@Test`、`@BeforeEach`、`@AfterEach`、`@ParameterizedTest` 等。- 提供 `@EnabledIf`、`@DisabledIf`、`@EnabledOnOs`、`@DisabledOnOs` 等注解,实现条件控制。
2025-06-21 15:46:17
403
原创 70、数据访问-redis操作与统计小实验
/ 输出Redis连接工厂类。host: r-bp1nc7reqesxisgxpipd.redis.rds.aliyuncs.com # Redis服务器地址。
2025-06-21 12:34:49
457
原创 69、数据访问-准备阿里云redis环境
**云数据库Redis版**:提供多种版本(如Redis 6.0、Redis 7.0)和高可用架构,适合需要稳定性和高可用性的场景。- **云数据库Tair版**:阿里云自研的增强型Redis,提供更高的性能和丰富的数据结构,适合对性能要求极高的应用。2. **选择地域和可用区**:选择实例所在的地域和可用区,建议选择与业务服务器相同的地域,降低网络延迟。- **设置白名单**:仅允许特定IP地址访问Redis实例,提高安全性。6. **设置密码**:为Redis实例设置强密码,防止未经授权的访问。
2025-06-20 00:06:46
443
原创 68、数据访问-crud实验-删除用户完成
**数据库表设计**:确保用户表(如`users`)已创建,包含必要的字段(如`id`、`username`、`email`等)。- **逻辑删除**:根据实际需求,可以选择物理删除或逻辑删除。- **数据关联**:如果用户数据与其他表有关联,需要考虑级联删除或处理关联数据,避免数据不一致。- **实体类定义**:定义与数据库表对应的实体类(如`User`),包含相应的属性和注解。- **权限控制**:确保只有授权用户才能执行删除操作,防止数据被误删或恶意删除。
2025-06-20 00:05:41
624
原创 67、数据访问-crud实验-分页数据展示
使用数据库的分页功能,如MySQL的`LIMIT`和`OFFSET`,或借助分页插件(如MyBatis的PageHelper)。分页数据展示是数据访问中常见的功能,用于将大量数据分割成多个页面显示,提升用户体验和系统性能。- 接收前端传递的当前页码(`currentPage`)和每页显示数量(`pageSize`)。1. **确定每页显示数量**:设定每页显示的数据条数(`pageSize`),如每页显示10条。- 接收后端返回的分页数据,展示当前页的数据。// 使用PageHelper进行分页查询。
2025-06-19 20:25:39
448
原创 66、数据访问-crud实验-数据列表展示【补录】
el-button @click="deleteUser(scope.row.id)" type="text">删除</el-button><el-button @click="editUser(scope.row)" type="text">编辑</el-button><el-table-column prop="username" label="用户名"></el-table-column>- 创建数据库表,例如`user`表,包含`id`、`username`、`password`等字段。
2025-06-18 12:51:30
812
原创 65、数据访问-整合MyBatisPlus操作数据库
queryWrapper.eq("username", "张三").like("password", "123");- **代码生成器**:使用MyBatis-Plus提供的代码生成器,快速生成实体类、Mapper接口等代码。- **版本管理**:及时关注MyBatis-Plus的版本更新,升级到最新稳定版,获取新特性和修复的漏洞。// 当前页,每页数量。- **性能优化**:合理使用分页查询、条件构造器,避免全表扫描;- 执行删除操作时,会自动更新该字段值,查询时自动过滤已逻辑删除的数据。
2025-06-18 12:50:12
320
原创 64、数据访问-整合Mybatis-注解配置混合版
**配置顺序**:如果同时为同一个Mapper接口配置注解和XML,需要在`mybatis-config.xml`中先配置`<mapper class="..."/>`,再配置`<mapper resource="..."/>`,以确保正确解析。- **方法名匹配**:XML中的`<select>`、`<insert>`等标签的`id`属性必须与Mapper接口中的方法名一致。- **命名空间匹配**:XML映射文件的`namespace`必须准确匹配Mapper接口的全限定名。
2025-06-17 13:05:09
331
原创 63、数据访问-整合mybatis-配置版
在`application.yml`或`application.properties`中配置MyBatis。- 在`resources`目录下创建`mapper`文件夹,放置Mapper对应的XML文件。- 在项目的`pom.xml`文件中添加MyBatis和数据库驱动的依赖。-- 其他依赖,如Spring、lombok等 -->- 在`application.yml`中配置数据库连接信息。- 配置MyBatis插件,如分页插件、性能分析插件等。-- MySQL驱动 -->-- 其他SQL语句 -->
2025-06-17 13:01:05
394
原创 60、数据访问-数据库场景的自动配置分析与整合测试
根据`application.properties`或`application.yml`中的配置(如`spring.datasource.url`、`spring.datasource.username`等),创建数据源实例。- 当引入数据库相关依赖(如`spring-boot-starter-jdbc`或`spring-boot-starter-data-jpa`)时,Spring Boot会自动检测类路径中的依赖。- 可通过`@Autowired`注入`JdbcTemplate`进行数据库操作。
2025-06-14 12:48:33
446
原创 59、定制化原理-SpringBoot定制化组件的几种方式
原理:`@EnableWebMvc`导入了`DelegatingWebMvcConfiguration`类,该类继承自`WebMvcConfigurationSupport`,导致`WebMvcAutoConfiguration`失效,从而禁用默认的Spring MVC自动配置。通过修改`application.properties`或`application.yml`文件,利用`@ConfigurationProperties`注解将配置项绑定到JavaBean上,从而调整组件的行为。
2025-06-14 12:46:37
448
原创 58、嵌入式Servlet容器-【源码分析】切换web服务器与定制化
`ServletWebServerFactoryAutoConfiguration`是关键的自动配置类,负责创建`ServletWebServerFactory`。通过以上方式,可以灵活地切换和定制Spring Boot的嵌入式Servlet容器,满足不同的应用需求。重新启动应用,Spring Boot将使用Jetty作为嵌入式Servlet容器。- 根据项目中引入的依赖,自动配置类会判断系统中存在哪些Web服务器相关的类。// 设置Jetty特有配置。-- 排除Tomcat -->
2025-06-13 18:14:42
376
原创 57、原生组件注入-【源码分析】DispatcherServlet注入原理
DispatcherServlet`的注入原理主要依赖于`Servlet`容器的生命周期和`Spring`的依赖注入机制。- `DispatcherServlet`继承自`FrameworkServlet`,而`FrameworkServlet`继承自`HttpServletBean`,最终`HttpServletBean`继承自`HttpServlet`。- 将当前`Servlet`转换为`BeanWrapper`,以便使用`Spring`的方式注入参数。
2025-06-13 18:13:39
402
原创 56、原生组件注入-原生注解与Spring方式注入
通过在组件类上使用`@WebServlet`、`@WebFilter`和`@WebListener`等注解,并配合`@ServletComponentScan`注解,Spring Boot会自动扫描并注册这些原生组件。在Spring Boot中,可以通过两种方式将原生的Servlet、Filter和Listener组件注入到应用程序中:**使用原生注解**和**使用Spring方式**。- 如果组件不需要依赖注入,且希望与Spring解耦,建议使用**原生注解方式**。### 一、使用原生注解注入。
2025-06-12 20:21:15
818
原创 55、错误处理-【源码流程】几种异常处理原理
Spring框架内置了一些异常处理器,如`DefaultHandlerExceptionResolver`,用于处理Spring框架自身抛出的异常。3. 根据异常类型查找`@ControllerAdvice`类中匹配的`@ExceptionHandler`方法。2. 如果找到精确匹配的错误页面,则返回该页面;否则,返回通用的`4xx.html`或`5xx.html`页面。- 在项目中定义特定的错误页面,如`error/404.html`、`error/5xx.html`等。// 跳转到错误页面。
2025-06-12 20:19:54
470
原创 54、错误处理-【源码流程】异常处理流程
`DefaultErrorAttributes` 将异常信息保存到 `request` 域的 `ERROR_ATTRIBUTE` 中,并返回 `null`。- 调用所有注册的 `HandlerExceptionResolver` 解析器,尝试处理异常。- 若存在对应的错误页面(如 `error/500.html`),则返回该页面。- 底层检测到未处理的异常后,会转发请求到 `/error` 路径。- 处理 `/error` 请求的控制器,负责返回错误响应。- 获取异常信息,设置响应状态码。
2025-06-11 20:52:48
505
原创 53、错误处理-【源码分析】底层组件功能分析
`BasicErrorController`处理`/error`请求,返回`ModelAndView`对象,视图名为`error`。- **类型**:`ErrorAttributes`、`HandlerExceptionResolver`- **使用`@ControllerAdvice`和`@ExceptionHandler`**:处理全局异常。- **自定义错误页面**:在`/templates/error`目录下创建特定状态码的HTML页面。- **作用**:处理默认`/error`路径的请求。
2025-06-11 20:51:21
631
原创 52、错误处理-SpringBoot默认错误处理机制
在 `classpath:/templates/error` 或 `classpath:/static/error` 目录下创建对应的错误页面,例如 `error/404.html`、`error/500.html`。4. **获取错误信息**:调用 `DefaultErrorAttributes` 的 `getErrorAttributes` 方法,获取错误信息的Map。2. **转发到 `/error`**:Spring MVC将异常请求转发到 `/error` 路径。
2025-06-10 09:04:09
521
原创 51、文件上传-【源码流程】文件上传参数解析器
这些信息被封装为`MultipartFile`对象,`MultipartFile`接口提供了对上传文件的操作方法,如`getOriginalFilename`、`getInputStream`、`transferTo`等。- 如果`isMultipart`返回`true`,表明是文件上传请求,`DispatcherServlet`调用`MultipartResolver`的`resolveMultipart`方法进行解析。- 调用`transferTo`方法可以将文件内容保存到指定位置。
2025-06-10 09:03:01
528
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人