提高Spring Boot技能的9种方法
以下是提高 Spring Boot 技能的 9 种方法:
1. 外部化您的配置:
充分利用 Spring Boot 潜力的另一种方法是尽可能地尝试外部化您的配置,而不是对其进行硬编码。外部化您的配置将使您的应用程序更加灵活且更易于管理。
外部化配置的另一个优点是,您不需要仅仅因为一个小更改就关闭应用程序、进行更改、重新编译,然后重新部署应用程序。
以下是如何外部化您的配置
要外部化您的配置,您需要使用 application.properties 或 application.yml
– 配置您的属性:
在 application.properties 或 application.yml 文件中,使用配置的前缀指定属性:
application.properties
app.bootstrap-servers=localhost:3000
app.client-id=digma-id
app.group-id=dgma-group
For application.yml
application.yml
app:
bootstrap-servers: localhost:3000
client-id: digma-id
- 创建配置属性类:
创建一个类来保存配置属性。用 @ConfigurationProperties 对其进行注解,以指定属性的前缀:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data
@Data
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String bootstrapServer;
private String clientId;
private String groupId;
}
- 注入配置:
将配置属性注入到组件或服务中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DemoService {
private final AppProperties appProperties;
private final Logger logger = LoggerFactory.getLogger(DemoService.class);
public DemoService(AppProperties appProperties) {
this.appProperties = appProperties;
}
public void printConfiguration() {
logger.info("App Name: {}", appProperties.getBootstrapServer());
logger.info("Version: {}", appProperties.getClientId());
logger.info("Version: {}", appProperties.getGroupId());
}
}
2.你需要保持你的控制器精简
充分利用 Spring Boot 潜力的另一种方法是确保控制器保持精简。保持控制器精简将帮助您避免导致“肥胖控制器”反模式的做法。
什么是“脂肪控制器”反模式?
“胖控制器”反模式是一种编程模式,其中 Web 应用程序中的控制器因业务逻辑而过载,违反了关注点分离原则。当控制者承担过多的责任时,必然会出现以下问题:
-
可维护性:大型控制器难以维护和理解。对业务逻辑的任何修改或添加都变得容易出错且复杂。
-
可测试性:随着业务逻辑嵌入到控制器中,单独执行测试变得困难,这使得创建可靠的单元测试变得具有挑战性。
-
可重用性:您很难在控制器中找到可重用的逻辑。如果应用程序的另一部分需要相同的逻辑,通常很难提取和重用。
-
可读性:当控制器中有业务逻辑时,代码库的可读性就会降低。开发人员很难快速了解控制器的用途和功能。
为了避免“脂肪控制器”反模式,请遵循以下原则:
- 无状态:默认情况下控制器是单例的,任何状态更改都可能导致很多问题。
- 委托:您的控制器应该进行委托,这意味着它不应该执行业务逻辑,而应该依赖委托。
- 封装:应用程序的 HTTP 层应该由控制器处理,而不应该由服务层处理。
- 以用例为中心:确保您的控制器是围绕用例或业务领域构建的。
3. 全局处理异常
要充分利用 Spring Boot,您需要学习如何全局处理异常,这很重要,因为:
-
它为您提供了对 HTTP 响应的细粒度控制,允许您根据异常类型返回自定义对象或响应。
-
您可以定义应全局应用的其他配置,例如模型属性或响应。
-
它可以防止每个控制器中出现重复的异常处理代码。您可以在 @ControllerAdvice 类中定义一次,确保采用一致且集中的异常处理方法,使我们的代码更易于维护。
要全局处理异常,您需要创建一个类并使用此注解来注释该类@ControllerAdvice(Web MVC 项目)@ControllerAdvice(Web MVC 项目)(Web API 项目)。@RestControllerAdvice 或
@ControllerAdvice 是为 Spring Boot MVC 应用程序设计的,它是一个注解,当应用于某个类时,会将其转换为全局控制器顾问程序,进而影响多个控制器。下面是 @ControllerAdvice 的样子。
@ControllerAdvice
public class GlobalControllerAdvice {
// Exception handling, model attributes, and other configurations
}
@RestControllerAdvice 此注解扩展了 @ControllerAdvice。它专为 RESTful 网络服务而设计。您可以在响应形式为 JSON 或 XML 的应用程序中使用它。下面是它的样子。
@RestControllerAdvice
public class ControllerAdvice {
@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(ResourceNotFoundException.class)
public ServiceResponse
handleResourceNotFoundException(ResourceNotFoundException ex) {
return new ServiceResponse<>(ex.getMessage(), false);
}
@ExceptionHandler 此注解用于处理控制器抛出的特定异常。此注解用于在控制器或类中声明使用 @ControllerAdvice 注解的方法。通过该注解,您可以自定义应用程序的行为。下面是它的外观。
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
var response = new ServiceResponse ();
var user = userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User", "id", id));
UserDto userDto = mapper.toDto(user);
response.setData(userDto, true);
log.info("Fetched user => {}", userDto);
return response;
}
在 Spring Boot 应用程序中使用 @ControllerAdvice 或 @RestControllerAdvice 允许您在 Spring Boot 应用程序的多个控制器中集中异常处理和其他配置。
4.利用延迟初始化
SpringApplication 允许您作为开发人员延迟初始化您的 Spring Boot 应用程序。当启用延迟初始化时,bean 将在需要时创建,而不是在应用程序启动期间创建。启用延迟初始化可减少应用程序启动所需的时间。
延迟初始化会导致许多与 Web 相关的 Bean 在收到 HTTP 请求之前不会进行初始化。
延迟初始化的缺点是它延迟了应用程序问题的发现。如果您延迟初始化配置错误的 bean,则该 bean 在启动期间不会发生故障,并且只有在初始化该 bean 时才会出现问题。
您需要确保 JVM 有足够的内存来容纳应用程序的所有 Bean,而不仅仅是那些在启动期间初始化的 Bean。在启用延迟初始化之前,您需要微调 JVM 的堆大小。
可以使用以下方式以编程方式启用延迟初始化:
- SpringApplicationBuilder 上的方法lazyInitialization
- SpringApplication 上的 setLazyInitialization 方法。
- spring.main.lazy-initialization 属性
5.充分利用STARTER POM
就像 AutoConfiguration 消除了配置通用功能的痛苦一样,Starter POM 消除了在以下环境中查找和配置通用依赖项的痛苦您的项目。
spring-boot-starter-data-jpa 是使用 Spring Data JPA 的入门工具。它包括以下编译的依赖项:
-
spring-boot-starter-jdbc:此启动器包含 JDBC 必需的库。
-
hibernate-core:这是 Hibernate 的主要库,它是一个对象关系映射 (ORM) 解决方案。
-
spring-data-jpa:此库提供核心 Spring Data JPA 功能。
-
spring-boot-starter-aop:该库支持 Spring Boot 中的面向方面编程,解决了横切问题,实现更简洁、模块化的代码。
-
spring-aspects: 当您需要 AspectJ 提供的高级功能(例如编织到第三方库)时,通常会使用此库。
因此,您无需搜索并添加所有这些依赖项并担心它们的兼容版本,只需添加一个 Starter POM — spring-boot-starter-data-jpa
6.使用SPRING BOOT CLI
Spring Boot CLI是Spring Boot团队提供的命令行工具。该工具允许您创建 Spring Boot Web 应用程序。显然,您需要安装它才能使用它,以下是安装方法。
On Mac:
$ sdk install springboot
On Windows:
> scoop bucket add extras
> scoop install spring boot
7. 掌握您偏好的构建工具
充分利用 Spring Boot 的一种方法是掌握您喜欢的构建工具。如果您更喜欢 Maven 或 Gradle 构建工具,则必须掌握它,了解其缺点,并且同样知道如何减轻您偏好的构建工具的缺点。
Maven 构建工具的一个常见抱怨是速度慢,缓解这一缺点的最佳方法是安装和使用Mvnd
Gradle 构建工具的一个常见缺点是方法名称一直在变化,因此缓解这一问题的唯一方法是让自己及时了解每个新版本的 Gradle 附带的新功能和已弃用的功能。
8. 认真对待可观察性
可观察性基本上是使用日志、指标和跟踪等外部输出来测量应用程序内部状态的过程。
Spring Boot 应用程序中的可观察性
执行器端点
确保充分发挥 Spring Boot 潜力的一种方法是使用 Spring Boot 执行器。该库允许您深入了解有关应用程序的操作信息。
一旦该库位于类路径上,默认情况下您就可以使用多个端点。
将 spring-boot-actuator 依赖项添加到包管理器以启用 spring-boot 执行器。
For Maven
org.springframework.boot spring-boot-starter-actuatorFor Gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
您需要知道的一点是,Actuator 的大部分端点都已禁用,只剩下 /health 和 /info 这两个端点处于启用状态。
要启用所有端点,请转到应用程序属性文件(application.properties)或应用程序文件(application.yml),然后添加以下内容
For application.properties
management.endpoints.web.exposure.include=*
For application.yml
management:
endpoints:
web:
exposure:
include: "*"
一些有趣的执行器端点
-
/health: 此端点向您显示应用程序的基本健康信息。它是最常用的端点之一,并且默认情况下公开。
您可以将此端点与外部监控工具(例如 Grafana、Prometheus)集成,以便在应用程序的运行状况发生变化时收到警报。
-
/info:此端点将向您显示应用程序信息。当您想要公开应用程序名称、版本和任何自定义属性等详细信息时,这非常有用。
从该端点获取的详细信息可以帮助其他开发人员或系统了解您的应用程序上下文。
-
/beans:此端点向您显示应用程序中所有 Spring bean 的完整列表。
当您想要分析 bean 依赖性、调试依赖注入问题并尝试了解应用程序的结构时,这会派上用场。
-
/loggers:此端点向您显示应用程序中记录器的配置。
使用此端点,您可以动态调整应用程序日志级别,启用/禁用特定包的日志记录。当您想要在运行时进行实时调试和故障排除时,这会派上用场。
-
/httptrace:此端点显示应用程序的 HTTP 跟踪信息。默认情况下,它仅显示最后 100 个 HTTP 请求-响应交换。
此端点对于诊断和分析应用程序的 HTTP 流量的行为非常有用,并帮助您识别和解决问题。
-
/metrics:此端点是应用程序指标。这些指标可以包括 JVM 内存使用情况、HTTP 请求计数等。此端点需要依赖于 micrometer-core。
此端点可帮助您监控应用程序的性能、检测异常并就如何优化或调整基础设施做出明智的决策。
-
/shutdown:当您到达此端点时,它将正常关闭您的 Spring Boot 应用程序。这是一项危险的操作,因此应妥善保护此端点。
谨慎使用此端点;在需要正常关闭的受控环境中使用此端点。
-
/env:此端点显示应用程序环境中定义的属性。这些属性可以包括系统属性、环境变量以及 application.properties 或 application.yml 中的属性。
该端点将帮助您了解应用程序的运行时环境、检查配置值、诊断和分析与配置相关的问题。
-
/mappings:此端点显示应用程序中所有 @RequestMapping 路径的列表。
通过此端点,您可以快速查看控制器的映射,这对于 API 文档来说非常方便。
-
/configprops:此端点显示整理的 @ConfigurationProperties 列表。
您可以查看属性的结构,找到错误配置,并确保您的应用程序使用正确的配置。
Spring Boot Actuator 通过 /actuator/health、/actuator/metrics 和 /actuator/env 等端点提供对应用程序内部结构的关键洞察。这些端点提供健康状态、详细指标和环境属性。
使Micrometer 收集指标
Micrometer 是一种多功能指标实用程序,支持各种监控系统,例如 Prometheus、Datadog 等。它提供了一系列仪器类型,是应用指标的首选解决方案,为选择监控工具提供了灵活性。
Spring Boot 中的日志记录Spring Boot 的日志记录依赖于 Commons Logging,但仍可适应不同的日志实现。它提供了 Logback、Log4J2 和 Java Util Logging 的默认配置,简化了日志记录设置和兼容性。
使用 OpenTelemetry 进行分布式跟踪
OpenTelemetry 在基于微服务的应用程序中提供端到端跟踪和可观察性。 Spring Boot 与 OpenTelemetry 无缝集成,支持代理检测和微米跟踪。使用生态系统工具引导您的可观察性并使可观察性数据变得有意义
digma.ai 等持续反馈工具可以使从不可观察性到完全可观察性的过程变得更加容易,但更重要的是,确保可观察性数据变得有影响力,而不仅仅是漂亮的仪表板。 Digma 和类似工具可以分析可观察性数据对您的代码意味着什么,以检测常见的反模式和问题,并在编码时为您提供反馈。
9. 测试,测试,测试
有了 Spring Boot,编写单元测试和集成测试就不再那么令人头疼,而是变得更令人满意。
Spring Boot 是开发具有强大测试功能的应用程序的绝佳选择。出于以下原因:
-
Spring Boot 与 JUnit、Mockito 和 Spring Test 等流行的测试框架无缝集成。
-
Spring Boot 提供了广泛的测试注释,包括 @SpringBootTest、@DataJpaTest 和 @WebMvcTest,它们有助于为特定类型的测试配置应用程序上下文,从而简化流程。
-
Spring Boot 允许您利用 Spring 框架的庞大生态系统,例如用于安全测试的 Spring Security 和用于数据库相关测试的 Spring Data。
-
Spring Boot 对 Mockito 等模拟框架的支持使您可以访问用于生成测试数据的实用程序,从而使您能够构建更强大的应用程序。
-
Spring Boot 与 TestContainers 很好地集成,可以快速跟踪您的集成测试。
-
如果您正在构建分布式应用程序,则测试是不可协商的。
测试驱动开发发生的一件伟大的事情是测试容器的使用。该开发相当新,值得庆幸的是 Spring Boot 集成了 Testcontainers。
Testcontainers 是一个功能强大的测试库,它提供简单且轻量级的一次性通用数据库实例,用于通过 Docker 容器中包装的真实服务引导集成测试。使用测试容器,您可以编写和运行与生产中使用的相同类型的服务或数据库对话的测试,而无需模拟或内存中服务。
测试容器的好处
- 再现性:每个测试都在干净的环境中运行,因为这消除了可能由过时或冲突状态引起的任何问题。
- 隔离:测试容器自动创建隔离的测试环境。这种隔离的环境有助于避免与外部依赖项的干扰。
- 易于使用:TestContainers 与 JUnit、Mockito、TestNG 等流行测试框架之间无缝集成,因此降低了设置单独测试环境的复杂性这意味着您可以使用相同的环境(容器)来托管您的软件,无论您是在构建、测试还是部署您的软件在生产中的应用。
https://www.jdon.com/71031.html
相关文章:
提高Spring Boot技能的9种方法
以下是提高 Spring Boot 技能的 9 种方法: 1. 外部化您的配置: 充分利用 Spring Boot 潜力的另一种方法是尽可能地尝试外部化您的配置,而不是对其进行硬编码。外部化您的配置将使您的应用程序更加灵活且更易于管理。 外部化配置的另一个优点…...
HIVE基本操作
1、启动远程服务端:hive --service metastore启动(这里是阻塞式),然后在客户端操作 2、Hive DDL(数据库定义语言) --展示所有数据库show databases; --切换数据库use database_name; 3、创建语法&#x…...
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 分发饼干 class Solutio…...
【大数据面试】MapReduce常见问题与答案
目录 介绍下MapReduce MapReduce优缺点 MapReduce架构 MapReduce工作原理 MapReduce哪个阶段最费时间 ✅MapReduce中的Combine是干嘛的?有什么好出? ✅MapReduce环形缓冲区是什么 ✅MapReduce为什么一定要有环型缓冲区 MapReduce为什么一定要有Shuffle过程 MapRedu…...
数组深入学习感悟
注:本文学习借鉴于《代码随想录》 一.介绍数组 数组是储存在连续内存空间中的相同类型数据的集合 数组名的理解: 数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外: sizeof(数组名),sizeof中单独放数…...
亚马逊云科技-如何缩容/减小您的AWS EC2根卷大小-简明教程
一、背景 Amazon EBS提供了块级存储卷以用于 EC2 实例,EBS具备弹性的特点,可以动态的增加容量、更改卷类型以及修改预配置的IOPS值。但是EBS不能动态的减少容量,在实际使用中,用户也许会存在此类场景: 在创建AWS EC2…...
[Java 基础] Java Stream
Java Stream 是 Java 8 引入的新特性之一,它提供了一种新的处理数据集合的方式。Stream 可以使我们更加方便地对集合进行处理和操作,同时还能提高代码的简洁性和可读性。 文章目录 什么是 Stream常见用法创建 Stream中间操作终端操作 总结 什么是 Stream…...
达芬奇18.6DaVinci ResolveStudio(Win/Mac)激活版
DaVinci Resolve Studio 18是一款业界领先的视频后期制作软件,它集成了剪辑、调色、视觉特效、动态图形和音频后期制作等功能,为用户提供了完整的创作解决方案。该软件不仅适用于电影、电视和网页内容的制作,还广泛应用于广告、纪录片和独立电…...
力扣题目学习笔记(OC + Swift)16. 最接近的三数之和
16. 最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 排序 双指针 思路同15. 三数之和 简单地使用三重循环枚举所有的三…...
基于STM32的DHT11温湿度传感器与LCD显示器的集成设计
在本文中,我们将详细介绍如何基于STM32微控制器实现DHT11温湿度传感器与LCD显示器的集成设计。我们将包括硬件连接、软件编程以及涉及的STM32库函数和相关知识。这个项目旨在帮助您理解如何使用STM32来读取DHT11温湿度传感器的数据,并将数据显示在LCD显示…...
解决浏览器自动将http跳转至https导致无法访问的问题
以下只针对Chrome浏览器 方法一: 1.地址栏中输入chrome://net-internals/#hsts。 2.在Delete domain中输入项目的域名,并Delete(删除)。 3.可以在Query domain测试是否删除成功。 HSTS全称:HTTP Strict Transport Se…...
小程序面试题 | 07.精选小程序面试题
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
深度学习的推理部分
深度学习的推理部分指的是已经训练好的深度学习模型应用于新数据(通常是测试或实际应用数据)以进行预测、分类、分割等任务的过程。在深度学习中,训练和推理是两个阶段: 训练阶段: 在这个阶段,深度学习模型…...
如何用 CleanMyMac 来保护 Mac 隐私
大家早上好,中午好,下午好,晚上好。 在我们使用MacBook上的自带浏览器-Safari(或者一些其他浏览器)进行网页浏览的时候,往往会留下一些痕迹。如果这些痕迹涉及一些敏感数据信息的话,那么我们肯…...
opencv入门到精通——鼠标事件和Trackbar控件的使用
目标 了解如何在OpenCV中处理鼠标事件 您将学习以下功能:cv.setMouseCallback() 了解将轨迹栏固定到OpenCV窗口 您将学习以下功能:cv.getTrackbarPos,cv.createTrackbar等。 简单演示 在这里,我们创建一个简单的应用程序&am…...
iOS 收集 SDK 内部 log
为 SDK 设置 log 等级,设置 RCIMClient 的 logLevel 为您期望的,可以在 SDK initWithAppkey 之后设置,比如希望只收集错误 log,那么可以设置为 RC_Log_Level_Error,如果想一般信息、警告信息,错误信息都收集…...
【CSS @property】CSS自定义属性说明与demo
CSS property property - CSS: Cascading Style Sheets | MDN At 规则 - CSS:层叠样式表 | MDN Custom properties (–*): CSS variables - CSS: Cascading Style Sheets | MDN CSS Houdini - Developer guides | MDN 📚 什么是property? property CSS…...
【华为数据之道学习笔记】6-3数据服务分类与建设规范
数据服务是为了更好地满足用户的数据消费需求而产生的,因此数据消费方的差异是数据服务分类的最关键因素。具体包括两大类:数据集服务和数据API服务。 1. 数据集服务 (1)数据集服务定义 比较常见的数据消费者有两类:一…...
Vue的脚手架
脚手架配置 脚手架文档:Vue CLI npm config set registry https://registry.npm.taobao.org vue.config.js配置选项: 配置参考 | Vue CLI ref选项 ref和id类似,给标签打标识。 document.getElementById(btn); this.$ref.btn; 父子组…...
Java实现Word中插入上标和下标
Java实现Word中插入上标和下标 Java不能直接在Word中插入上标和下标,但是可以通过POI库来实现。 下面提供一个Java代码示例,使用POI库向Word中插入带有上标和下标的文字: import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.…...
Java和Python中的目标堆栈规划实现
目标堆栈规划是一种简单高效的人工智能规划算法,用于解决复合目标问题。它的工作原理是**将总体目标分解为更小的子目标,然后以向后的顺序逐一解决它们。 让我们考虑一个简单的例子来说明目标堆栈规划。想象一下你想要烤一个蛋糕,目标是准备…...
(前端)后管系统登录后隐藏url上信息同时获取url上携带参数~开发需求(bug)总结7
问题描述: 首先我这个后管项目是若依权限管理系统,路由实现都是动态加载的。现在有一个需求,后端会邮件发送系统中的链接,这个链接是携带参数(id、用户的加密信息),比如:https://47.23.12.1/task/list?id…...
CSS3新增样式
1,圆角边框 在CSS3中,新增了圆角边框样式,这样我们的盒子就可以变圆角了 border-radious属性用于设置元素的外边框圆角 语法: border-radious:length; radious 半径(圆的半径)原理…...
HP服务器idrac设置以及系统安装
HP服务器idrac设置以及系统安装 一、设置管理口的地址和密码1、HP服务器重新界面选择"F9"进入BIOS,设置iLo5(idrac)的IP和用户名密码。2、选择"系统配置"。3、选择"iLO 4"配置程序。4、网络选项是设置idrac管理口的地址,设…...
rpc和消息队列区别
RPC 和消息队列都是分布式微服务系统中重要的组件之一,下面我们来简单对比一下两者: 从用途来看:RPC 主要用来解决两个服务的远程通信问题,不需要了解底层网络的通信机制。通过 RPC可以帮助我们调用远程计算机上某个服务的方法&a…...
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
当使用ssh登录服务器时,由于文件权限没有设置报以下错误 WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions for test_1.pem are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Loa…...
虚幻学习笔记18—C++委托(多播)和事件
一、前言 委托分单播和多播,多播就是可以绑定多个回调函数,然后一次性执行。这样也可以理解为啥多播没有返回值,多个回调函数执行后返回哪一个都是问题啊。而事件呢官方官方文档说法是“对于事件而言,只有定义事件的类才能调用 Br…...
【UML】第9篇 类图
目录 一、类图的概念 二、类图的主要作用 三、类图的构成 3.1 类的名称 3.2 抽象类(Abstract Class) 一、类图的概念 类图是UML模型中静态视图。它用来描述系统中的有意义的概念,包括具体的概念、抽象的概念、实现方面的概念等。静态视…...
I.MX6ULL启动详解:Boot配置、Bootable image启动头的组成
本篇文章来了解一下I.MX6ULL的启动方式,实际上之前我介绍了NXP的跨界MCU RT1170的启动方式:I.MX RT1170启动详解:Boot配置、Bootable image头的组成,两个芯片虽然一个是Cortex-M,一个是Cortex-A,但是都是来…...
隐藏通信隧道技术——防御SSH隧道攻击的思路
隐藏通信隧道技术——防御SSH隧道攻击的思路 在内网中建立一个稳定、可靠的数据通道,对渗透测试工作来说具有重要的意义。应用层的隧道通信技术主要利用应用软件提供的端口来发送数据。常用的隧道协议有SSH、HTTP/HTTPS和DNS。 SSH协议 在一般情况下ÿ…...
wap网站搭建/域名停靠网页app推广大全
一,问题描述 用postman调用上传接口,基本每两次调用会有一次报错,如下 {"timestamp": "2023-04-11T03:00:15.4690000","status": 500,"error": "Internal Server Error","exceptio…...
wordpress如何搭建网站/域名免费注册0元注册
flutter学习(5) GridView Gridview是网格布局 文章目录flutter学习(5) GridView一.GridView常用属性二.GridView.count 实现网格布局三.GridView.builder实现网格布局一.GridView常用属性 二.GridView.count 实现网格布局 看这个 import package:flutter/material.dart; import…...
面试简历模板免费/seosem是什么职位
用例设计 目标 1. 掌握如何编写自动化测试用例文档 1. 编写自动化测试用例的原则 1. 自动化测试用例一般只实现核心业务流程或者重复执行率较高的功能。 2. 自动化测试用例的选择一般以“正向”逻辑的验证为主。 3. 不是所有手工用例都可以使用自动化测试来执行。 4. 尽…...
上海网站建设维护/seo是什么服
Flutter基础—你好,Flutter! Flutter基础—开发环境与入门 Flutter基础—第一个Flutter实例 Flutter基础—质感设计 Flutter基础—手势处理 Flutter基础—应用实例 Flutter基础—根据用户输入改变控件 Flutter基础—常用控件之容器 Flutter基础—…...
大唐工作室 网站制作/网站关键词全国各地的排名情况
题意:给定一个分数,问用分子为1的分数加和来构成这个分数有多少种方式。要求每种情况分数的个数不超过n,分母乘积不超过a。 思路:搜索。一开始做犯了一个错误导致一直TLE,就是把当前分数和的分子和分母存为全局变量&a…...
公司网站做的好的/百度指数查询入口
一、选择题1. 在一个C 源程序文件中所定义的全局变量,其作用域为( )。A. 所在文件的全部范围 B. 所在程序的全部范围 C. 所在函数的全部范围D. 由具体定义位置和extern 说明来决定范围 答:D【解析】全局变量是在函数外部任意位置上定义的变量,…...