Java开发经验——阿里巴巴编码规范经验总结2
摘要
这篇文章是关于Java开发中阿里巴巴编码规范的经验总结。它强调了避免使用Apache BeanUtils进行属性复制,因为它效率低下且类型转换不安全。推荐使用Spring BeanUtils、Hutool BeanUtil、MapStruct或手动赋值等替代方案。文章还指出不应在视图模板中加入复杂逻辑运算,应明确MVC架构各层的职责。此外,还涉及数据结构初始化应指定大小、正则表达式的预编译、避免通过catch处理某些RuntimeException异常、finally块中资源关闭的正确方式以及防止NPE的多种方法。
1. 【强制】避免用 ApacheBeanutils 进行属性的 copy。
不推荐使用 Apache Commons BeanUtils 工具来进行对象属性复制(如 BeanUtils.copyProperties),因为它效率低、性能差、类型转换不安全,在生产环境中容易成为性能瓶颈。
Apache BeanUtils 是通过反射 + 内省(Introspector)+ 字符串转换来做属性 copy,性能非常低,不适合在高并发或大量对象转换场景中使用。
1.1. 属性赋值推荐方案
方案 | 优势 | 场景 |
Spring BeanUtils | 性能略优于 Apache,但仍是反射 | 适合小量级对象拷贝 |
Hutool BeanUtil | 性能高,支持深拷贝、自定义字段映射 | 推荐在工具类中统一封装 |
MapStruct | 编译期生成拷贝代码(无反射,极快) | 推荐在 DDD 中的 DO <-> DTO 映射 |
手动赋值 | 最安全、最清晰 | 小对象或关键转换逻辑 |
ModelMapper / Dozer(不推荐) | 仍是反射,配置复杂,性能低 | 不推荐使用 |
2. 【强制】不要在视图模板中加入任何复杂的逻辑运算。
在 MVC 架构的具体实现中,比如 Spring Boot 项目中,我们常见的结构包括:
- Controller(控制器)
- Service(服务/业务逻辑层)
- DAO(数据访问层,也叫 Mapper、Repository)
下面是这三层的职责和理解方式,结合“不要在视图中写复杂逻辑”的那条建议,进一步深化层次的划分:
2.1. Controller:控制层
职责:
- 接收 HTTP 请求参数;
- 调用 Service 进行处理;
- 封装和返回响应数据(
Response
); - 做参数校验、权限判断、日志记录等外围操作。
不要做的事:
- 不要写业务逻辑;
- 不要操作数据库;
- 不要做复杂的流程判断或数据处理。
示例:
@PostMapping("/user/upgrade")
public Response<Void> upgradeUser(@RequestBody UserUpgradeRequest request) {userService.upgradeUserToVip(request.getUserId());return Response.success();
}
2.2. Service:业务逻辑层
职责:
- 实现具体业务逻辑,如“升级用户为 VIP”、“扣减库存”、“发送通知”等;
- 调用多个 DAO、封装业务判断流程;
- 做事务控制(
@Transactional
); - 组装处理结果返回 Controller。
不要做的事:
- 不要和 Web 框架(如 Servlet、HttpRequest)耦合;
- 不要拼 SQL,不直接操作数据库。
示例:
public void upgradeUserToVip(Long userId) {UserDO user = userDao.findById(userId);if (user == null || user.isVip()) {throw new BizException("用户不存在或已是VIP");}user.setVip(true);userDao.update(user);notifyService.sendVipNotification(user);
}
2.3. DAO(Mapper/Repository):数据访问层
职责:
- 直接与数据库交互;
- 封装 SQL 查询(或通过 MyBatis/JPA 映射);
- 只做增删改查操作;
- 返回实体对象,不做业务判断。
不要做的事:
- 不要处理业务逻辑;
- 不要做流程判断;
- 不要拼接复杂结果(如组装响应对象)。
示例:
@Mapper
public interface UserDao {UserDO findById(Long userId);int update(UserDO user);
}
2.4. 总结类比:工厂分工
层级 | 类比 | 职责 |
Controller | 前台接待 | 接收客户请求,转交到内部处理 |
Service | 经理 | 安排工人干活,处理流程,判断异常 |
DAO | 工人 | 操作数据库,搬原材料,不决策 |
2.5. MVC 和模板逻辑的对应关系
- 视图(View) = 页面模板、前端:只能展示数据,不参与 Controller、Service、DAO 的职责。
- 所以复杂判断、业务数据准备都应该在 Service/Controller 中完成,模板中直接展示结果即可。
3. 【强制】任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存。
3.1. 这条建议的核心思想是
在使用如集合(List、Map、Set 等)这类可扩展数据结构时,应尽可能“预估其大小”并“显式设置初始容量”,从而避免它们在运行中频繁扩容、内存抖动,甚至 OOM(内存溢出)的问题。提前预估数据量,合理初始化集合容量,是性能优化与内存安全的重要实践。
ArrayList
HashMap
HashSet
ConcurrentHashMap
StringBuilder
自定义缓存、队列等
这些类的背后都依赖一个数组或哈希桶来存储数据,如果你没有指定容量,它们会用默认大小初始化,然后在插入过程中自动扩容(重新开数组、拷贝数据等)。
3.2. 为什么要指定大小?
3.2.1. 不指定容量的风险:
- 频繁扩容: 每次容量不够都要重新分配数组,拷贝旧数据 ➜ 性能开销大;
- 内存浪费: 扩容步长不是线性的,可能会分配远超实际需要的空间;
- 内存溢出(OOM): 在循环里构造数据结构没有设置上限 ➜ 无限增长,吃光堆内存。
3.2.2. 指定容量的好处:
- 减少扩容次数: 提高性能;
- 控制内存: 限制最大容量,防止意外 OOM;
- 体现程序边界意识: 编码更健壮。
3.3. 数据结构设置初始值示例对比
3.3.1. 不指定大小(有性能隐患):
List<String> list = new ArrayList<>();
for (int i = 0; i < 100000; i++) {list.add("item" + i);
}
默认容量是 10,之后 1.5 倍扩容 ➜ 至少扩容 10+ 次,代价很高
3.3.2. 指定大小(性能友好):
List<String> list = new ArrayList<>(100000);
for (int i = 0; i < 100000; i++) {list.add("item" + i);
}
只创建一次内部数组,避免扩容
3.4. 延伸到场景
数据结构 | 默认容量 | 推荐用法 |
| 10 | new ArrayList<>(预计数量) |
| 16 | new HashMap<>(预计数量 / 负载因子 + 1) |
| 16 | new StringBuilder(预计字符串长度) |
| 16 | new ConcurrentHashMap<>(预计大小) |
4. 【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
说明:不要在方法体内定义:Pattern pattern = Pattern.compile("规则");
正则表达式在使用时,如果每次都重新编译,会严重影响性能。应该使用预编译(Pattern.compile(...)
)方式,将正则表达式提前编译好并重复使用。
在 Java 中使用正则时,一般有两种方式:
4.1. 每次都编译(效率低)
boolean isMatch = "abc123".matches("\\w+");
内部其实相当于:
Pattern.compile("\\w+").matcher("abc123").matches();
这会每次调用都重新编译正则表达式,开销很大,尤其在循环或高并发下。
4.2. 预编译后复用(推荐)
private static final Pattern PATTERN = Pattern.compile("\\w+");boolean isMatch = PATTERN.matcher("abc123").matches();
正则表达式只在类加载时编译一次,后续调用直接复用,提高性能。
4.3. 使用场景
场景 | 是否推荐预编译 |
单次用、不频繁 | 可以临时用 |
多次校验、循环中用 | 必须预编译 |
高并发服务接口中 | 必须预编译 |
工具类/公共方法 | 强烈建议预编译并静态缓存 |
4.4. 总结
- 编译正则是耗时操作;
- 多次使用时,一定要用
Pattern.compile(...)
并缓存起来; - 正则预编译 = 性能优化 + 好习惯。
5. 【强制】Java 类库中定义的可以通过预检查方式规避的 RuntimeException 异常不应该通过 catch 的方式来处理,比如:NullPointerException,IndexOutOfBoundsException 等等。
try-catch 是用来处理不可预知的异常情况,不是用来“代替 if 判断”的。对于 Java 类库中常见的 RuntimeException(运行时异常),如果我们可以在代码运行前通过逻辑“预检查”避免它的发生,就不应该依赖 try-catch 来处理它。
5.1. 举几个典型例子
5.1.1. 不推荐的做法(用 catch
捕获 NPE):
try {System.out.println(user.getName());
} catch (NullPointerException e) {// 捕获空指针异常System.out.println("user 为空");
}
5.1.2. 推荐的做法(用 if
判断提前规避):
if (user != null) {System.out.println(user.getName());
} else {System.out.println("user 为空");
}
5.2. 为什么不推荐用 catch 处理这些异常?
- 这类异常不是业务异常,而是代码逻辑错误:出现 NullPointer、数组越界等,说明你的代码逻辑写得有问题,不是正常的“可恢复”情况。
- catch 成本高,影响性能:try-catch 的异常捕获机制在 JVM 中性能是开销较大的(尤其是频繁抛异常的情况)。
- 可读性变差,调试困难:滥用 catch 会把真正的问题掩盖,调试困难,也不利于代码维护。
5.3. 适用的异常类型(不建议 catch)
异常类 | 说明 |
| 空指针异常,应通过非空判断避免 |
| 下标越界,应判断下标是否合法 |
| 类型转换错误,应先 |
| 参数非法,应通过参数校验处理 |
5.4. 异常捕获正确的原则
- 能通过逻辑避免的异常,不要 try-catch
- RuntimeException 更多是一种编码警告,不是业务流程的一部分
- 只在顶层兜底或做日志监控时统一捕获这些异常
6. 【强制】finally 块必须对资源对象、 流对象进行关闭,有异常也要做 try-catch。
无论是否发生异常,finally
块中一定要确保资源被正确关闭,且关闭操作本身也要加 try-catch
,避免二次异常导致资源未释放。
6.1. 正确的使用方式示例:
自 Java 7 起,Java 提供了 try-with-resources
语法,它能够自动关闭实现了 AutoCloseable
或 Closeable
接口的资源(如 InputStream
)。使用该语法,可以消除手动管理资源关闭的复杂性,并自动处理 close()
方法可能抛出的异常。
try (InputStream in = new FileInputStream("data.txt")) {// 读文件逻辑
} catch (IOException e) {e.printStackTrace(); // 异常处理
}
6.2. 错误的示例(不捕获关闭异常):
finally {in.close(); // 如果这里抛出 IOException,整个异常流程会被覆盖
}
6.3. 适用范围:
这条规范适用于所有需要关闭或释放的资源类,例如:
- IO 流(InputStream、OutputStream、Reader、Writer 等)
- 数据库连接(Connection、Statement、ResultSet)
- 网络资源(Socket、HttpURLConnection)
- 文件句柄
- 线程池(ExecutorService 的
shutdown
) - 锁(
Lock.unlock()
)
7. 【推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景
1)返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE,反例:public int method() { return Integer 对象; },如果为 null,自动解箱抛 NPE。
2)数据库的查询结果可能为 null。
3)集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
4)远程调用返回对象时,一律要求进行空指针判断,防止 NPE。
5)对于 Session 中获取的数据,建议进行 NPE 检查,避免空指针。
6)级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。正例: 使用 JDK8 的 Optional 类来防止 NPE 问题。
7.1. 常见的 NPE 产生场景
7.1.1. 访问未初始化的对象
当你尝试访问一个未初始化的对象(即其值为 null
)时,通常会抛出 NPE。
String str = null;
int length = str.length(); // NPE: str 是 null,无法调用 length()
7.1.2. 调用 null
对象的实例方法
如果对象为 null
,直接调用其方法会导致空指针异常。
MyClass obj = null;
obj.someMethod(); // NPE: obj 是 null,无法调用 someMethod()
7.1.3. 尝试访问 null
数组元素
对 null
数组尝试访问元素时也会抛出 NPE。
String[] arr = null;
String element = arr[0]; // NPE: arr 是 null,无法访问元素
7.1.4. 传递 null
给不接受 null
的方法
有些方法要求传入非 null
的参数,如果传入 null
,可能会触发 NPE。
public void printLength(String str) {
System.out.println(str.length()); // 如果 str 为 null,将引发 NPE
}
7.1.5. 链式调用中的空指针
在链式调用中,如果某一环节返回了 null
,而后续还对其进行方法调用,就会导致 NPE。
Person person = getPerson();
int age = person.getAddress().getCity().getZipCode(); // 如果 person 或 address 为 null,则会 NPE
7.2. 如何防止NPE问题?
7.2.1. 避免使用 null
值
尽量避免使用 null
,特别是在可能触发 NPE 的地方。可以使用 Optional 来表示可能为空的值。
Optional<String> optionalStr = Optional.ofNullable(str);
optionalStr.ifPresent(s -> System.out.println(s.length())); // 安全访问
7.2.2. 空值检查
在调用对象的方法之前,先检查对象是否为 null
。
if (str != null) {System.out.println(str.length()); // 只有 str 非 null 时才调用方法
} else {System.out.println("str is null");
}
7.2.3. 使用默认值
如果方法或字段值可能为 null
,考虑使用默认值或替代值。
String str = Optional.ofNullable(inputString).orElse("default value");
7.2.4. 适用断言和工具库
通过工具库如 Apache Commons Lang 提供的 StringUtils
或 ObjectUtils
等可以避免手动编写空值检查代码,减少 NPE 风险。
StringUtils.isNotEmpty(str); // 不会抛出空指针异常
7.2.5. 使用 @NonNull
和 @Nullable
注解
通过注解可以清楚标明方法参数或返回值是否可以为空,这有助于避免因不清楚空指针约束导致的 NPE。
public void processString(@NonNull String str) {// str 必须不为 null
}
7.2.6. 避免深层嵌套的链式调用
通过设计合理的 API 接口或引入中间变量,避免深层次的链式调用,降低因某一环节为 null
导致的 NPE 风险。
Address address = person != null ? person.getAddress() : null;
if (address != null) {// 安全地访问 address
}
博文参考
相关文章:
Java开发经验——阿里巴巴编码规范经验总结2
摘要 这篇文章是关于Java开发中阿里巴巴编码规范的经验总结。它强调了避免使用Apache BeanUtils进行属性复制,因为它效率低下且类型转换不安全。推荐使用Spring BeanUtils、Hutool BeanUtil、MapStruct或手动赋值等替代方案。文章还指出不应在视图模板中加入复杂逻…...
Linux中常见开发工具简单介绍
目录 apt/yum 介绍 常用命令 install remove list vim 介绍 常用模式 命令模式 插入模式 批量操作 底行模式 模式替换图 vim的配置文件 gcc/g 介绍 处理过程 预处理 编译 汇编 链接 库 静态库 动态库(共享库) make/Makefile …...
深入理解深度Q网络DQN:基于python从零实现
DQN是什么玩意儿? 深度Q网络(DQN)是深度强化学习领域里一个超厉害的算法。它把Q学习和深度神经网络巧妙地结合在了一起,专门用来搞定那些状态空间维度特别高、特别复杂的难题。它展示了用函数近似来学习价值函数的超能力…...
使用lldb看看Rust的HashMap
目录 前言 正文 读取桶的状态 获取键值对 键值对的指针地址 此时,读取数据 读取索引4的键值对 多添加几个键值对 使用i32作为键,&str作为值 使用i32作为键,String作为值 前言 前面使用ldb看了看不同的类型,这篇再使用…...
Vue3简易版购物车的实现。
文章目录 一、话不多说,直接上代码? 一、话不多说,直接上代码? <template><div><input type"text" placeholder"请输入内容" v-model"keywords"><button click"addGood…...
比亚迪全栈自研生态的底层逻辑
比亚迪全栈自研生态的底层逻辑:汽车工程师必须理解的闭环技术革命 引言:当技术壁垒成为护城河 2023年比亚迪销量突破302万辆的震撼数据背后,隐藏着一个更值得工程师深思的事实:其全栈自研体系覆盖了新能源汽车83%的核心零部件。这…...
[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)
[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八) 引言 在当今网络安全威胁日益严峻的背景下,为 Web 应用启用 HTTPS 已成为基本要求。Spring Boot 提供了简单高效的方式集成 HTTPS 支持,无论是开发环境测试还是生产环境部署࿰…...
5.1.1 WPF中Command使用介绍
WPF 的命令系统是一种强大的输入处理机制,它比传统的事件处理更加灵活和可重用,特别适合 MVVM (Model, View, ViewModel)模式开发。 一、命令系统核心概念 1.命令系统基本元素: 命令(Command): 即ICommand类,使用最多的是RoutedCommand,也可以自己继承ICommand使用自定…...
设计模式简述(十九)桥梁模式
桥梁模式 描述基本组件使用 描述 桥梁模式是一种相对简单的模式,通常以组合替代继承的方式实现。 从设计原则来讲,可以说是单一职责的一种体现。 将原本在一个类中的功能,按更细的粒度拆分到不同的类中,然后各自独立发展。 基本…...
常用设计模式
一、什么是设计模式 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验总结,旨在解决面向对象设计中反复出现的问题,提升代码的可重用性、可理解性和可靠性。以下从多个维度详细讲解ÿ…...
20242817-李臻-课下作业:Qt和Sqlite
实验内容 阅读附件内容,编译运行附件中第一章,第三章的例子。 实验过程 第一章 t1实践 #include <QApplication> #include <QWidget> #include <QPushButton> #include <QVBoxLayout>int main(int argc, char *argv[]) {QA…...
嵌入式机器学习平台Edge Impulse图像分类 – 快速入门
陈拓 2025/05/08-2025/05/11 1. 简介 官方网址 https://edgeimpulse.com/ 适用于任何边缘设备的人工智能: Gateways - 网关 Sensors & Cameras - 传感器和摄像头 Docker Containers - Docker容器 MCUs, NPUs, CPUs, GPUs 构建数据集、训练模型并优化库以…...
JavaWeb, Spring, Spring Boot
出现时间 JavaWeb - Spring - Spring Boot 一、JavaWeb 的发展历程 Servlet 和 JSP: Servlet:1997 年首次发布,用于处理 HTTP 请求和响应。 JSP:1999 年首次发布,用于动态生成 HTML 页面。 特点:提供了基…...
upload-labs靶场通关详解:第五关
一、分析源代码 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(".php",".php5",".php4",".php3",".php2",".html",".htm",".ph…...
【问题】Watt加速github访问速度:好用[特殊字符]
前言 GitHub 是全球知名的代码托管平台,主要用于软件开发,提供 Git 仓库托管、协作工具等功能,经常要用到,但是国内用户常因网络问题难以稳定访问 。 Watt Toolkit(原名 Steam)是由江苏蒸汽凡星科技有限公…...
GitHub打开缓慢甚至失败的解决办法
在C:\Windows\System32\drivers\etc的hosts中增加如下内容: 20.205.243.166 github.com 199.59.149.236 github.global.ssl.fastly.net185.199.109.153 http://assets-cdn.github.com 185.199.108.153 http://assets-cdn.github.com 185.199.110.153 http://asset…...
【25软考网工】第六章(3)数字签名和数字证书
博客主页:christine-rr-CSDN博客 专栏主页:软考中级网络工程师笔记 大家好,我是christine-rr !目前《软考中级网络工程师》专栏已经更新二十多篇文章了,每篇笔记都包含详细的知识点,希望能帮助到你!…...
Android Native 函数 Hook 技术介绍
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 前言 Android Native 函数 Hook 技术是一种在应用运行时拦截或替换系统或自身函数行为的手段,常见实现包括 PLT Hook、Inline Hook。 PLT Hook 和…...
代码随想录算法训练营第60期第三十二天打卡
大家好,今天是我们贪心算法章节的第三阶段,前面我们讲过的几道题不知道大家理解的情况如何,还是那句话,贪心算法没有固定的套路与模板,一道题一个思路,我们要多思考这样慢慢地我就就可以水到渠成。今天我们…...
Problem C: 异常1
1.题目描述 检测年龄,其中若为负数或大于等于200岁皆为异常,请将下列代码补充完整。 // 你的代码将被嵌入这里 class Main{ public static void main(String[] args){ Person p1new Person("John",80); Person p2new Pers…...
Ollama部署使用以及模型微调和本地部署
ollama是一款开源的本地大语言模型管理工具,专注于简化大语言模型(LLM)的本地部署和使用。以下是关于 Ollama 应用的详细介绍: Ollama 的主要功能 本地化部署: Ollama 支持在本地运行模型,无需依赖外部云…...
汇编学习——iOS开发对arm64汇编的初步了解
汇编学习——iOS开发对arm64汇编的初步了解 文章目录 汇编学习——iOS开发对arm64汇编的初步了解前言栈 指令 寄存器寄存器指令运算指令寻址指令前变基 与 后变基 栈堆(Heap)内存机制三、栈(Stack)内存机制 3. 多级调用示例 例子A…...
前端代理问题
在前后端联调的时候,有一次因为前端项目代理配置有问题,导致请求接口对不上, transpileDependencies: true,devServer: {hot: true,port: 8081,proxy: {/api: {target: http://localhost:8080,changeOrigin: true,ws: true,pathRewrite: {^/a…...
E+H流量计通过Profibus DP主站转Modbus TCP网关与上位机轻松通讯
EH流量计通过Profibus DP主站转Modbus TCP网关与上位机轻松通讯 在现代工业自动化的广阔舞台上,Profibus DP与Modbus TCP这两种通信协议各领风骚,它们在不同的应用场景中发挥着举足轻重的作用。但工业生产的复杂性往往要求不同设备、系统之间能够顺畅沟…...
TCP/IP 模型每层的封装格式
TCP/IP 模型是一个四层网络架构,每一层在数据传输时都会对数据进行封装,添加相应的头部(和尾部)信息。以下是各层的封装格式及关键字段说明: 1. 应用层(Application Layer) 封装格式:…...
openjdk底层汇编指令调用(一)——汇编指令及指令编码基础
汇编指令 计算机在执行过程时只识别代表0或者1的电信号。因此为了让计算机能够执行则须向计算机输入一系列01构成的指令。 例如在x64平台下,0x53,二进制为01010011,表示将rbx寄存器中的值压栈。 但是,对于程序员而言,…...
5G-A来了!5G信号多个A带来哪些改变?
5G-A来了!5G信号多个A带来哪些改变? 随着科技不断进步,通信网络的迭代升级也在加速。自4G、5G的推出以来,我们见证了通信技术的飞跃式发展。最近,越来越多的用户发现自己手机屏幕右上角的5G标识已经变成了“5G-A”。那…...
探索虚拟化:云计算时代的资源优化之道
前言 如果您想知道云提供商如何在全球范围内运行无数应用程序,而每个应用程序都没有机架服务器,那么答案就在于虚拟化。 它是为云提供支持的核心技术之一,在幕后悄悄工作,使现代计算高效、可扩展且具有成本效益。 在本文中&#x…...
用户登录构件示例
目录 一、登录构件概述 二、构件内部结构 1. 构件组成元素(表格形式) 2. 组件连接件设计...
【软件测试】基于项目驱动的功能测试报告
目录 一、项目的介绍 1.1 项目背景 二、测试目标 2.1 用户服务模块 2.1.1 用户注册模块 2.1.1.1 测试点 2.1.1.2 边界值分析法(等价类+边界值) 2.1.1.2.1 有效等价类 2.1.1.2.2 无效等价类 2.1.1.2.3 边界值 2.1.1.2.4 测试用例设计 2.2 文章标签模块 2.3 文章模…...
【QT】UDP通讯本地调试
qt已经写好了udp通讯代码,现在要进行测试。 1、终端输入ipconfig查看本机网卡的ipv4地址 2、 用udpBind函数,绑定到此ip和自定义的端口号。 3、 打开网络调试助手,自动检测到本机的ip地址,输入任意一个和程序里不一样的端口号。 …...
web animation API 锋利的css动画控制器 (更新中)
什么是web animation api 以及为什么要使用web animation api? web animation API 是web页面中控制DOM元素动画效果的javascript原生API。 它能够逐个关键帧控制动画效果,具有Timeline 机制能通过javascript来实现动画的暂停,播放&#x…...
Nginx的增强与可视化!OpenResty Manager - 现代化UI+高性能反向代理+安全防护
以下是对OpenResty Manager的简要介绍: OpenResty Manager (Nginx 增强版),是一款容易使用、功能强大且美观的反向代理工具 ,可以作为OpenResty Edge 的开源替代品基于 OpenResty 开发,支持并继承 OpenRes…...
Spring Boot 中的重试机制
Retryable 注解简介 Retryable 注解是 Spring Retry 模块提供的,用于自动重试可能会失败的方法。在微服务架构和分布式系统中,服务之间的调用可能会因为网络问题、服务繁忙等原因失败。使用 Retryable 可以提高应用的稳定性和容错能力 1。 使用步骤 &…...
[Java实战]Spring Boot 整合 Freemarker (十一)
[Java实战]Spring Boot 整合 Freemarker (十一) 引言 Apache FreeMarker 作为一款高性能的模板引擎,凭借其简洁语法、卓越性能和灵活扩展性,在 Java Web 开发中占据重要地位。结合 Spring Boot 的自动化配置能力,开发者能快速构建动态页面、…...
现有预测式外呼系统如何接入AI系统,使用AI辅助,判断出意向客户再转人工
很多用户还在使用老旧的预测式外呼系统,只能外呼接通后播放一个提示音,播放完提示音后在转给人工坐席, 如果重新部署一套AI外呼系统,涉及到业务系统的迁移,非常不方便。 现在我就做一个如何让现有外呼系统,…...
实战项目3(04)
目录 任务场景一 【r1配置】 【sw1配置】 任务场景二 【r1配置】 【sw1配置】 【sw2配置】 任务场景一 某公司网络为了减少广播包对网络的影响,网络管理员对网络进行了VLAN划分,完成VLAN划分后,为了不影响VL…...
[Java实战]Spring Boot 静态资源配置(十三)
[Java实战]Spring Boot 静态资源配置(十三) 引言 静态资源(如 HTML、CSS、JavaScript、图片等)是 Web 应用的基石。Spring Boot 通过自动化配置简化了静态资源管理,但面对复杂场景(如多模块项目、CDN 集成…...
ESP-ADF wifi_service子模块wifi_ssid_manager凭证管理函数详解
目录 ESP-ADF wifi_service子模块wifi_ssid_manager凭证管理函数详解WiFi凭证管理函数分析wifi_ssid_manager_savewifi_ssid_manager_erase_all 内部实现机制存储策略分析内部数据流向关键辅助函数分析重要的内部辅助函数详解get_stored_id_by_ssidnvs_get_write_idnvs_set_cou…...
数据分析预备篇---NumPy数组
NumPy是数据分析时常用的库,全称为Numerical Python,是很多数据或科学相关Python包的基础,包括pandas,scipy等等,常常被用于科学及工程领域。NumPy最核心的数据结构是ND array,意思是N维数组。 #以下是一个普通列表的操作示例:arr = [5,17,3,26,31]#打印第一个元素 prin…...
解决VirtualBox中虚拟机(ubuntu)与主机(windows)之间互相复制粘贴(文本)
一.开始的设置 1.在VirtualBox中打开设置,常规中修改主机与虚拟机交互设置 2.虚拟机关闭状态下,存储中选中控制器SATA,勾选‘使用主机输入输出’ 3.选中操作系统对应的虚拟文件,.vdi文件,勾选右边的固态驱动器。 4.启…...
单细胞RNA测序数据分析与可视化:从基础原理到高级应用
引言 单细胞RNA测序(scRNA-seq)技术的出现彻底改变了我们研究复杂生物系统的方式,使科学家能够在前所未有的精细水平上解析细胞异质性。传统的bulk RNA测序只能捕获细胞群体的平均表达特征,而单细胞转录组测序允许我们检测每个细…...
嵌入式硬件篇---UART
文章目录 前言1. UART协议基础1.1 物理层特性两根信号线无时钟信号电平标准TTL UARTRS-232 1.2 数据帧格式1.3 波特率计算波特率 2. STM32F103RCT6的UART配置2.1 硬件连接2.2 CubeMX配置启用USART1引脚分配中断启用(可选) 3. HAL库代码实现3.1 UART初始化…...
C# 通过ConfigurationManager读写配置文件App.Config
目录 简述代码描述一、构建App.config二、调用代码1、代码步骤说明2、输出结果说明 简述 App.config 是 C#中最常用的配置文件类型。 通常位于项目的根目录中,以 XML 格式存储配置信息。App.config 文件可以包含多个配置节,如 appSettings、connectionS…...
Python3安装HTMLTestRunner
1.下载HTMLTestRunner地址:http://tungwaiyip.info/software/HTMLTestRunner.html 2.下载的HTMLTestRunner.py是针对python2写的,所以需要改成python3适合的内容: 问题1:No module named StringIO, 原因:py…...
图形化编程革命:iVX携手AI 原生开发范式
一、技术核心:图形化编程的底层架构解析 1. 图形化开发的效率优势:代码量减少 72% 的秘密 传统文本编程存在显著的信息密度瓶颈。以 "按钮点击→条件判断→调用接口→弹窗反馈" 流程为例,Python 实现需定义函数、处理缩进并编写 …...
GC垃圾回收
Gc是语言提供的自动的内存管理机制,自动释放不需要的内存对象,让出存储器资源。 Go语言变革: V1.5的三色并发标记法 V1.5的三色并发标记为什么需要STW V1.5的三色标记为什么需要屏障机制(“强-弱”,三色不变式、插入屏障、删除屏障…...
“多端多接口多向传导”空战数据链体系——从异构融合架构到抗毁弹性网络的系统性设计
“多端多接口多向传导”空战数据链体系——从异构融合架构到抗毁弹性网络的系统性设计 文章目录 “多端多接口多向传导”空战数据链体系——从异构融合架构到抗毁弹性网络的系统性设计第一章 引言:空战数据链体系的范式革新1.1 空战数据链的演进逻辑1.2 新架构的核心理论价值1…...
Unity3D仿星露谷物语开发42之粒子系统
1、目标 使用例子系统,实现割草后草掉落的特效。 通过PoolManager获取特效预制体,通过VFXManager来触发特效。 2、配置例子特效 在Hierarchy -> PersistentScene下创建新物体命名为Reaping。 给该物体添加Particle System组件。 配置例子系统参数…...
python打卡训练营打卡记录day22
复习日 仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle泰坦尼克号人员生还预测 导入数据 # 导入所需库 import pandas as pd impor…...