配合 Spring Bean 注入,把 Function 管理起来?
大家好呀!今天我们来聊聊一个特别有意思的话题 - 如何在Spring中优雅地管理和注入Function对象。就像把各种调料整齐地摆在厨房里一样,我们要把各种函数方法也管理得井井有条!🍳
一、为什么要把Function管起来?🤔
想象一下你有一个大厨房(Spring容器),里面有很多调料(Bean)。现在你想做菜(执行业务逻辑),但每次都要临时去找调料,多麻烦啊!如果能把常用的调料组合(函数组合)提前准备好,用的时候直接拿,是不是很方便?
在Java 8+中,Function接口就像是一个万能调料瓶🧂,可以装各种"调味逻辑"。而在Spring中管理它们,就能:
- 避免重复造轮子 ♻️ - 同样的逻辑不用写很多遍
- 灵活组合 🧩 - 像乐高一样拼装各种业务逻辑
- 统一管理 📦 - 所有函数都在Spring容器里,随用随取
二、基础课:Function的几种姿势 🧘
先来快速回顾下Java中Function的几种形式:
// 1. 传统写法
Function strToInt = new Function() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s);}
};// 2. Lambda表达式
Function strToInt = s -> Integer.parseInt(s);// 3. 方法引用
Function strToInt = Integer::parseInt;
三、Spring中注入Function的5种方法 🛠️
方法1:直接@Bean声明法
@Configuration
public class FunctionConfig {@Beanpublic Function stringToInteger() {return Integer::parseInt;}@Beanpublic Function integerToString() {return Object::toString;}
}
使用的时候:
@Service
public class MyService {@Autowiredprivate Function stringToInteger;public void doSomething() {int num = stringToInteger.apply("123");System.out.println(num); // 输出: 123}
}
方法2:函数工厂模式 🏭
@Component
public class FunctionFactory {public Function addPrefix(String prefix) {return str -> prefix + str;}public Function addSuffix(String suffix) {return str -> str + suffix;}
}
使用示例:
@Service
public class MyService {@Autowiredprivate FunctionFactory functionFactory;public void process() {Function prefixFunc = functionFactory.addPrefix("Hello-");String result = prefixFunc.apply("World");System.out.println(result); // 输出: Hello-World}
}
方法3:使用FunctionCatalog 📚
Spring Cloud Function提供了一个FunctionCatalog,可以自动收集所有Function类型的Bean:
@Bean
public Function uppercase() {return String::toUpperCase;
}@Bean
public Function reverse() {return s -> new StringBuilder(s).reverse().toString();
}
然后可以这样用:
@Autowired
private FunctionCatalog functionCatalog;public void useFunctions() {Function upper = functionCatalog.lookup("uppercase");System.out.println(upper.apply("hello")); // 输出: HELLO
}
方法4:函数组合技 🥋
@Configuration
public class FunctionCompositionConfig {@Beanpublic Function pipeline() {Function trim = String::trim;Function toUpper = String::toUpperCase;Function addExclamation = s -> s + "!";return trim.andThen(toUpper).andThen(addExclamation);}
}
使用效果:
@Autowired
private Function pipeline;public void test() {String result = pipeline.apply(" hello world ");System.out.println(result); // 输出: HELLO WORLD!
}
方法5:条件型Function 🌈
@Configuration
public class ConditionalFunctions {@Bean@ConditionalOnProperty(name = "features.advanced", havingValue = "true")public Function advancedCalculation() {return num -> num * num + 100;}@Bean@ConditionalOnProperty(name = "features.advanced", havingValue = "false")public Function simpleCalculation() {return num -> num + 10;}
}
四、高级玩法:函数大杂烩 🍲
1. 函数集合注入
@Configuration
public class MultiFunctionConfig {@Beanpublic Function countLetters() {return String::length;}@Beanpublic Function reverseString() {return s -> new StringBuilder(s).reverse().toString();}
}@Service
public class FunctionUser {// 注入所有Function@Autowiredprivate Map functions;public void useAllFunctions(String input) {functions.forEach((name, func) -> {System.out.println(name + ": " + func.apply(input));});}
}
2. 带参数的Function工厂
@Component
public class DynamicFunctionFactory {public Function createFunction(String operation) {switch (operation) {case "uppercase":return String::toUpperCase;case "lowercase":return String::toLowerCase;case "reverse":return s -> new StringBuilder(s).reverse().toString();default:return Function.identity();}}
}
3. 函数路由
@Bean
public Function> functionRouter() {return operation -> {switch (operation) {case "upper": return String::toUpperCase;case "lower": return String::toLowerCase;default: return s -> s;}};
}// 使用
@Autowired
private Function> router;public void routeExample() {Function upperFunc = router.apply("upper");String result = upperFunc.apply("hello");
}
五、实战案例:订单处理流水线 🏗️
假设我们有一个订单处理系统,需要依次进行:验证 → 折扣计算 → 税费计算 → 记录日志
@Configuration
public class OrderProcessingPipeline {// 1. 验证订单@Beanpublic Function validateOrder() {return order -> {if (order.getAmount() <= 0) {throw new IllegalArgumentException("订单金额必须大于0");}return order;};}// 2. 应用折扣@Beanpublic Function applyDiscount() {return order -> {if (order.isVIP()) {order.setAmount(order.getAmount() * 0.9); // VIP打9折}return order;};}// 3. 计算税费@Beanpublic Function calculateTax() {return order -> {double tax = order.getAmount() * 0.1; // 10%税order.setTax(tax);order.setTotalAmount(order.getAmount() + tax);return order;};}// 4. 记录日志@Beanpublic Function logOrder() {return order -> {System.out.println("处理完成的订单: " + order);return order;};}// 组合成完整流水线@Beanpublic Function orderProcessingPipeline() {return validateOrder().andThen(applyDiscount()).andThen(calculateTax()).andThen(logOrder());}
}
使用这个流水线:
@Service
public class OrderService {@Autowiredprivate Function orderProcessingPipeline;public Order processOrder(Order order) {return orderProcessingPipeline.apply(order);}
}
六、遇到的坑和填坑指南 🕳️
坑1:函数命名冲突
如果两个Function的输入输出类型完全一样,Spring会懵掉:“我该用哪个?🤯”
解决方案:
- 使用@Qualifier指定具体实现
- 给函数起不同的名字
- 包装成不同的Bean类型
坑2:函数组合时的异常处理
如果流水线中某一步出错了,整个流水线就崩了💥
解决方案:
@Bean
public Function safeProcessingPipeline() {return validateOrder().andThen(order -> {try {return applyDiscount().apply(order);} catch (Exception e) {System.err.println("折扣应用失败: " + e.getMessage());return order; // 跳过这步继续}}).andThen(calculateTax()).andThen(logOrder());
}
坑3:性能问题
如果函数特别多特别复杂,可能会影响性能🐢
优化建议:
- 对高频函数使用缓存
- 避免在函数中做耗时操作
- 考虑使用并行流处理
七、单元测试你的Function �
测试Spring中的Function和测试普通Bean差不多:
@SpringBootTest
public class FunctionTests {@Autowiredprivate Function stringToInteger;@Testpublic void testStringToInteger() {assertEquals(123, (int) stringToInteger.apply("123"));}@Test(expected = NumberFormatException.class)public void testInvalidInput() {stringToInteger.apply("abc");}
}
对于函数组合的测试:
@Test
public void testPipeline() {Order order = new Order(100.0, false);Order processed = orderProcessingPipeline.apply(order);assertEquals(110.0, processed.getTotalAmount(), 0.001); // 100 + 10%税assertTrue(processed.getTax() > 0);
}
八、总结:Function管理的最佳实践 🏆
- 合理命名 - 给函数起个见名知意的好名字
- 单一职责 - 每个函数只做一件事
- 适当组合 - 像搭积木一样组合简单函数
- 文档注释 - 特别是对复杂函数
- 单元测试 - 确保每个函数都可靠
- 性能考量 - 避免在函数中做耗时操作
九、扩展思考 🤔
- 如何动态注册/注销Function?
- 如何基于配置文件动态组装函数流水线?
- 如何监控函数调用的性能和次数?
这些问题的答案,就留给聪明的你去探索啦!🚀
希望这篇"厨房秘籍"能帮你把Spring中的Function管理得井井有条!如果有任何问题,欢迎在评论区交流~ 💬
Happy coding! 😊
推荐阅读文章
-
由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
-
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
-
HTTP、HTTPS、Cookie 和 Session 之间的关系
-
什么是 Cookie?简单介绍与使用方法
-
什么是 Session?如何应用?
-
使用 Spring 框架构建 MVC 应用程序:初学者教程
-
有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
-
如何理解应用 Java 多线程与并发编程?
-
把握Java泛型的艺术:协变、逆变与不可变性一网打尽
-
Java Spring 中常用的 @PostConstruct 注解使用总结
-
如何理解线程安全这个概念?
-
理解 Java 桥接方法
-
Spring 整合嵌入式 Tomcat 容器
-
Tomcat 如何加载 SpringMVC 组件
-
“在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
-
“避免序列化灾难:掌握实现 Serializable 的真相!(二)”
-
如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
-
解密 Redis:如何通过 IO 多路复用征服高并发挑战!
-
线程 vs 虚拟线程:深入理解及区别
-
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
-
10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
-
“打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
-
Java 中消除 If-else 技巧总结
-
线程池的核心参数配置(仅供参考)
-
【人工智能】聊聊Transformer,深度学习的一股清流(13)
-
Java 枚举的几个常用技巧,你可以试着用用
-
由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
-
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
-
HTTP、HTTPS、Cookie 和 Session 之间的关系
-
使用 Spring 框架构建 MVC 应用程序:初学者教程
-
有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
-
Java Spring 中常用的 @PostConstruct 注解使用总结
-
线程 vs 虚拟线程:深入理解及区别
-
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
-
10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
-
探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)
-
为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)
相关文章:
配合 Spring Bean 注入,把 Function 管理起来?
大家好呀!今天我们来聊聊一个特别有意思的话题 - 如何在Spring中优雅地管理和注入Function对象。就像把各种调料整齐地摆在厨房里一样,我们要把各种函数方法也管理得井井有条!🍳 一、为什么要把Function管起来?&#…...
Wireshark TS | 异常 ACK 数据包处理
问题背景 来自于学习群里群友讨论的一个数据包跟踪文件,在其中涉及到两处数据包异常现象,而产生这些现象的实际原因是数据包乱序。由于这两处数据包异常,都有点特别,本篇也就其中一个异常现象单独展开说明。 问题信息 数据包跟…...
vue3 el-dialog新增弹窗,不希望一进去就校验名称没有填写
就是在进入弹窗时、点击关闭/取消按钮时等情况清空该表单校验,在失去焦点或者点击确定/提交按钮的时候再去校验。这里默认已经写好了在失去焦点或者点击确定/提交按钮的时候的校验逻辑。 解决步骤: 一、定义清空表单校验方法 // 清空表单校验const cle…...
【2-12】CRC循环冗余校验码
前言 前面我们介绍了纠错码——海明码,同时还说明了为什么现代网络常用检错重传而不是纠错,本文介绍CRC循环冗余校验码。 文章目录 前言1. 简单定义2. 生成规则3. 例题3.1 例13.2 例2 后记修改记录 1. 简单定义 CRC(Cyclic Redundancy Chec…...
多 Agent 协作怎么整:从谷歌A2A到多Agent交互方案实现
写在前面:多 Agent 协作模式 大型语言模型(LLM)的浪潮之下,能够自主理解、规划并执行任务的 AI Agent(智能体)正成为人工智能领域最炙手可热的焦点。我们惊叹于单个 Agent 展现出的强大能力,但当面对日益复杂的现实世界任务时,单个 Agent 的局限性也逐渐显现。 正如人…...
内部聊天软件,BeeWorks-安全的企业内部通讯软件
企业在享受数据便利的同时,如何保障企业数据安全已经成为无法回避的重要课题。BeeWorks作为一款专为企业设计的内部通讯软件,通过全链路的安全能力升维,为企业提供了一个安全、高效、便捷的沟通协作平台,全面保障企业数据安全。 …...
健康养生:开启活力生活的密钥
当我们在健身房看到年逾六旬却身形矫健的老人,在公园偶遇精神矍铄、步伐轻快的长者,总会惊叹于他们的健康状态。其实,这些都得益于长期坚持科学的养生之道。健康养生并非遥不可及的玄学,而是融入生活细节的智慧。 在饮食的世界…...
士兵乱斗(贪心)
问题 B: 士兵乱斗 - USCOJ...
Android 不插SIM卡,手机不能拨打紧急电话;2g+gsm配置才支持112紧急拨号
[DESCRIPTION] 不插SIM卡,手机不能拨打紧急电话 Root Cause 手机没有写入合法的IMEI;或者当地的某个运营商不支持紧急电话,而手机正好选上了这个运营商;或者当地的某个运营商不支持无SIM卡的紧急电话,而手机正好选上了这个运营商 [SOLUTION] …...
Freertos----信号量
一、信号量的特性: 生产者为任务A、B,消费者为任务C、D一开始信号量的计数值为0,如果任务C、D想获得信号量,会有两种结果: 阻塞:买不到东西咱就等等吧,可以定个闹钟(超时时间)即刻返回失败&…...
AI 数字短视频数字人源码开发的多元价值与深远意义
在短视频行业竞争日益激烈的当下,AI 数字短视频数字人源码开发正以颠覆性的姿态,为行业带来诸多前所未有的优势,从创作、传播到商业变现等环节,全面重塑短视频生态。 创新创作模式,激发无限创意 传统短视频创作受…...
Apifox下载安装与使用
一、Apifox下载 官网地址:Apifox 点击"免费下载",即可进行下载。 二、Apifox安装 双击安装文件即可安装。...
命令行参数解析 - argparse 模块
1、简介 argparse 模块是 Python 标准库中提供的一个 命令行解析模块 ,它可以让使用者以类似 Unix/Linux 命令参数的方式输入参数(在终端以命令行的方式指定参数),argparse 会自动将命令行指定的参数解析为 Python 变量ÿ…...
【Android】 如何将 APK 内置为系统应用(适用于编辑设置属性)
如何将 APK 内置为系统应用(适用于编辑设置属性) 在 Android 中,将 APK 文件内置为系统应用涉及到一系列的命令和步骤。以下是详细的操作流程,帮助您解决常见问题,如 /system not in /proc/mounts 的错误。 挂载system/app获取可读写权限 …...
随手笔记-python-opencv 读取图像的顺序 与pytorch处理图像的顺序
import cv2# 读取图像 image_path path/to/your/image.jpg # 替换为你的图像路径 image cv2.imread(image_path)# 检查图像是否成功读取 if image is None:print("Error: Unable to load image.") else:print("Image loaded successfully.") 1、OpenCV…...
996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容
996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容 获取 Input 内容测试NPC参考资料获取 Input 内容 测试NPC -- NPC入口函数 function main(player)local msg = [[<Img|id=9527|x=0|y=0|width=300|height=150|img=public/bg_npc_01.png|bg=1|move=1|reset=1|show=0|layer…...
少数服从多数悖论、黑白颠倒与众人孤立现象之如何应对(一)
观己之前,也可先观众生 如果当时没有袖手旁观,或许唇不亡齿也不会寒 ■如何轻松/更好应对个别被众人孤立(他人、辨别、自己) ●他人被孤立 不参与 有余力,助弱者 被孤立者本身有问题 •不参与:不会辨…...
大模型在急性单纯性阑尾炎预测及治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与创新点 二、急性单纯性阑尾炎概述 2.1 定义与发病机制 2.2 临床表现 2.3 传统诊断方法 三、大模型在急性单纯性阑尾炎预测中的应用 3.1 大模型简介 3.2 数据收集与处理 3.3 模型训练与优化 3.4 预测…...
科研新触角:松灵六轴臂重构具身智能生态
在具身智能(Embodied AI)从实验室走向产业化的进程中,硬件性能与场景适配性成为技术落地的核心瓶颈。松灵机器人推出的全自研科研级轻量六轴机械臂PiPER,以“轻量化设计毫米级精度跨平台兼容”三大技术突破,重新定义了…...
第四讲 感应熔炼电炉设计和感应器参数计算(中)
第四讲 感应熔炼电炉设计和感应器参数计算(中) 目录 第四讲 感应熔炼电炉设计和感应器参数计算(中)磁轭、短路环、消磁环、水冷圈的设计1. 磁轭的设计1.1 磁轭的作用1.2 磁轭的材料1.3 磁轭截面设计1.4 磁轭高度的确定1.5 磁轭总重…...
【Contiki】Contiki源码目录结构
00. 目录 文章目录 00. 目录01. 概述02. Contiki目录结构03. apps目录04. core目录05. CPU目录06. doc目录07. examples目录08. platform目录09. regression-tests目录10. tools目录11. 附录 01. 概述 Contiki是一款开源操作系统,专为微小的低功耗微控制器设计&…...
第五章 SQLite数据库:3、SQLite 常用语法及使用案例
SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向表中添加新数据行。 语法 INSERT INTO 有两种常见语法形式: 使用列名指定要插入的列: -- 插入数据并指定列名 INSERT INTO TABLE_NAME (column1, column2, ..., columnN) VALUES (value1, va…...
【安卓开发】【Android Studio】Menu(菜单栏)的使用及常见问题
一、菜单栏选项 在项目中添加顶部菜单栏的方法: 在res目录下新建menu文件夹,在该文件夹下新建用于菜单栏的xml文件: 举例说明菜单栏的写法,只添加一个选项元素: <?xml version"1.0" encoding"ut…...
web-ssrfme
SSRF漏洞 SSRF是Server-Side Request Forgery(服务器端请求伪造)的缩写,是一种网络攻击技术。攻击者发送恶意请求给目标服务器,让服务器去访问攻击者指定的其他服务器或者域名,从而获取敏感信息或者攻击其他系统。 S…...
Linux:进程:进程状态
进程是一个负责分配系统资源(CPU时间,内存)的实体。 进程内核数据结构(用于描述和组织进程)代码数据(实际内容) 描述进程-PCB 进程信息被放在⼀个叫做进程控制块的数据结构中,简称…...
NoSQL 与 NewSQL 全面对比:如何选择适合你的数据库方案?
1. 引言 随着互联网业务的爆发式增长,传统关系型数据库(RDBMS)面临着越来越大的挑战。海量数据存储、高并发访问、低延迟响应等需求促使技术团队寻找更适合的解决方案。在这一背景下,NoSQL 和 NewSQL 作为两种不同方向的技术路线…...
在 MoonBit 中引入 Elm 架构:用简单原则打造健壮的 Web 应用
Elm 是一种纯函数式编程语言,专为构建前端 Web 应用程序而设计。它编译为 JavaScript,强调简洁性、性能和健壮性。 纯函数式的含义是函数没有副作用,这使得代码更易于理解和调试。通过强大的静态类型检查,Elm 确保应用程序不会抛…...
虚幻基础:ue引擎的碰撞
文章目录 碰撞:碰撞体间 运动后 产生碰撞的行为——由引擎负责,并向各自发送事件忽略重叠阻挡 碰撞体类型模式纯查询:不清楚具体作用可以阻挡 actor碰撞(武器:刀/子弹)子组件可以产生阻挡 角色的碰撞只有根组件可以阻挡࿰…...
「电商玩法」AI自动创作系统源码:商品图+视频+营销文案一键生成
—零代码搭建智能内容工厂,1人日更1000条爆款素材 电商行业核心痛点 1. 内容产能不足 中小商家无力承担专业摄影/剪辑,商品图质量差→转化率<1%热点借势慢:竞品已开始推“淄博烧烤同款”,你的素材还在拍摄中 2. 成本居高不下…...
图形变换算法
一、学习目的 (1)掌握多面体的存储方法。 (2)掌握图形的几何变换及投影变换。 (3)掌握三维形体不同投影方法的投影图的生成原理。 (4)掌握多面体投影图绘制的编程方法。 二、学…...
no such window: target window already closed的解决方法
我在使用selenium 切换窗口的时候,由于不小心关闭了一个窗口,运行的时候就遇到这样的警告: no such window: target window already closed 具体的问题展示: 这个问题表示:当前的页面被关闭了,selenium 找…...
vue常见错误
1、 Cant resolve vant/lib/index.less 1. 未正确安装 Vant 首先,确保你已经正确安装了 Vant。可以通过以下命令来安装: npm install vant --save 或者使用 yarn: yarn add vant 2. LESS 加载器未配置 如果你在项目中使用了 Vant 的 L…...
chrome中的copy xpath 与copy full xpath的区别
学过测试或者爬虫的,都感觉获取网页元素,使用xpath最方便 但其中有一些细节可能会使你摸不清头脑 比如有时候copy xpath会定位不准确,而使用copy full xpath就可以定位 1、copy xpath(相对路径定位) 优点ÿ…...
【Docker】运行错误提示 unknown shorthand flag: ‘d‘ in -d ----详细解决方法
使用docker拉取Dify的时候遇到错误 错误提示 unknown shorthand flag: d in -dUsage: docker [OPTIONS] COMMAND [ARG...]错误原因解析 出现 unknown shorthand flag: d in -d 的根本原因是 Docker 命令格式与当前版本不兼容,具体分为以下两种情况: 新…...
VS Code 安装及常用插件
一、VS Code下载与安装 1、概述 Visual Studio Code简称VS Code,是一款功能强大的代码编辑器,与IDE(集成开发环境)不同,VS Code需要安装平台相应的编译器和语言的扩展。 IDE:是用于提供程序开发环境的应…...
iptables防火墙
目录 一 Linux防火墙基础 1 iptables的表,链结构 (1)规则表 filter 表 nat 表 mangle 表 raw 表 (2)规则链 2 数据包过滤的匹配流程 (1)规则表之间的顺序 (2)…...
【JavaWeb】详细讲解 HTTP 协议
文章目录 一、HTTP简介1.1 概念1.2 特点 二、协议2.1 HTTP-请求协议(1)GET方式(2)POST方式(3)GET和POST的区别: 2.2 HTTP-响应协议(1)格式(2)响应…...
非阻塞I/O操作
非阻塞I/O操作是一种I/O操作模式,在这种模式下,应用程序在发出I/O请求后不会立即等待操作完成,而是继续执行其他任务。当I/O操作完成或可以进行时,系统会通知应用程序。这种操作模式可以提高程序的效率和响应能力,因为…...
Redis面试问题详解2
Redis面试问题详解2 一、分布式锁 分布式锁主要用于解决多服务器之间的并发问题。Redis通过SETNX命令实现分布式锁,确保同一时间只有一个线程可以获取锁。 1. 基本实现 获取锁 使用SETNX命令设置锁,并设置一个过期时间,避免死锁。 Stri…...
【软件测试】性能测试概念篇
1. 性能测试的定义 性能测试是通过模拟真实用户行为、系统负载或极端条件,评估软件系统在特定场景下的响应能力、稳定性、资源消耗及扩展性的过程。其核心目标是: 验证系统容量:确保系统在预期负载下(如…...
在Pycharm配置stable diffusion环境(使用conda虚拟环境)
自己配环境的时候也没个指南,少安装包或者包之间版本冲突是再按正常不过的事了,真的令人不胜其烦。 下面记录一下自己在conda虚拟环境配置stable diffusion的代码环境,希望能帮大家少踩几个坑。 虚拟环境配置 默认你已经安装了annaconda&am…...
Uniapp微信小程序:轻松获取用户头像和昵称
参考文献:Uniapp微信小程序:轻松获取用户头像和昵称-百度开发者中心 (baidu.com) uni.login({ provider: weixin, success: function (loginRes) { console.log(loginRes.authResult); // 打印登录凭证 // 使用登录凭证获取用户信息 uni.getUserInfo({ …...
Qt核心知识总结
Qt核心知识总结 Qt 是一个功能强大、跨平台的 C 应用程序开发框架,广泛应用于图形用户界面(GUI)应用程序的开发,同时也支持非 GUI 应用程序的开发。本文将从入门到精通的角度,详细解析 Qt 的核心知识点,帮…...
Doris的向量化执行如何支撑分布式架构和复杂查询
Doris 的向量化执行能力与其 分布式架构 和 复杂查询优化 深度结合,通过 批处理 列式计算 分布式调度 的协同设计,解决传统分布式数据库在复杂查询场景下的性能瓶颈。以下是具体原理展开: 一、向量化如何适配分布式架构? Doris…...
无源蓝牙技术与传统RFID(射频识别)对比
百事可乐的无源蓝牙技术与传统RFID(射频识别)虽然都属无线通信技术,但在工作原理、应用场景和技术性能上存在显著差异。以下是深度对比分析: 一、核心技术差异 维度无源蓝牙(如百事方案)R…...
Operator 开发入门系列(一):Hello World
背景 我们公司最近计划将产品迁移到 Kubernetes 环境。 为了更好地管理和自动化我们的应用程序,我们决定使用 Kubernetes Operator。 本系列博客将记录我们学习和开发 Operator 的过程,希望能帮助更多的人入门 Operator 开发。 目标读者 对 Kubernete…...
Immich图库本地部署与远程管理:打造你的专属照片云服务
文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 小伙伴们,你们好呀!今天要给大家带来一个超炫的技能——让你家的电脑秒变私人云相册,并且…...
OpenShift AI + DeepSeek+IBM CP4BA:实现AI业务自动化中台
一、OpenShift AI DeepSeek 1、什么是 OpenShift AI? OpenShift AI(前身为 Red Hat Open Data Hub)是 Red Hat OpenShift 平台上的一套 AI/ML 工具集,基于 Kubernetes,为企业提供可扩展的机器学习平台,可…...
游戏引擎学习第229天
仓库:https://gitee.com/mrxiao_com/2d_game_5 回顾上次内容并介绍今天的主题 上次留下的是一个非常简单的任务,至少第一步是非常简单的。我们需要在渲染器中加入排序功能,这样我们的精灵(sprites)才能以正确的顺序显示。为此我…...
genhtml 工具使用说明
genhtml 工具使用说明 简介 genhtml 是一个用于生成 HTML 格式代码覆盖率报告的工具,基于 lcov 生成的覆盖数据文件(如 lcov.info)生成交互式 HTML 报告。它支持多种自定义选项,可控制报告内容、样式、输出格式等。 基本用法 ge…...