Springboot 集成 SpringState 状态机

  • 1.SpringState 简介
  • 2.状态机示例
    • 2.1 项目结构和依赖包
    • 2.2 定义事件类和状态类
    • 2.3 Spring 事件监听器
    • 2.4 状态机持久化类
      • 2.4.1 Redis 状态机持久化容器
      • 2.4.2 Redis 配置
      • 2.4.3 状态机监听器
    • 2.5 装机器容器
    • 2.6 状态机事件发送器
    • 2.7 状态机配置
    • 2.8 接口类
    • 2.9 实现类
    • 2.10 状态机上下文
    • 2.11 配置文件
  • 3.状态机测试
    • 3.1创建订单
    • 3.2持久化结果
    • 3.3 支付订单
    • 3.4 发货
    • 3.5 确认收货

1.SpringState 简介

状态机核心概念​​

项目说明
状态(State)​​对象生命周期中的特定条件(如订单的待支付、已发货)
事件(Event)​​触发状态转换的动作(如支付成功、取消订单)
转换(Transition)​​定义事件如何驱动状态迁移(如待支付 → 支付事件 → 待发货)
守卫(Guard)​​条件检查,决定是否允许转换(如“仅未超时订单可支付”)
​​动作(Action)​​条件检查,决定是否允许转换(如“仅未超时订单可支付”)

应用场景

  • 订单生命周期管理​​
    管理订单从创建到完成的完整流程(如待支付 → 待发货 → 已完成)

  • 工作流引擎​​
    审批流程的状态控制(如提交 → 审核中 → 已批准)

  • ​​游戏状态流转​​
    角色状态切换(如空闲 → 战斗 → 死亡)

  • 物联网设备监控​​
    设备状态跟踪(如离线 → 在线 → 故障)

2.状态机示例

2.1 项目结构和依赖包

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring-state-m</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-boot.version>3.5.3</spring-boot.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Spring State Machine --><dependency><groupId>org.springframework.statemachine</groupId><artifactId>spring-statemachine-starter</artifactId><version>4.0.0</version></dependency><!-- Spring State Machine Redis Persistence --><dependency><groupId>org.springframework.statemachine</groupId><artifactId>spring-statemachine-data-redis</artifactId><version>4.0.0</version></dependency></dependencies>
</project>

启动类

package org.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@EnableAsync
@SpringBootApplication
public class SpringStateMachine {public static void main(String[] args) {SpringApplication.run(SpringStateMachine.class, args);}
}

2.2 定义事件类和状态类

事件用于驱动状态转移,状态用于记录事件进度

事件类

package org.example.common;/*** @Author zhx && moon* @Since 21* @Date 2025-06-18 PM 6:38*/
public enum OrderEvent {PAY,            // 支付操作SHIP,           // 发货操作CONFIRM,        // 确认收货CANCEL          // 取消订单
}

状态类

package org.example.common;/*** @Author zhx && moon* @Since 21* @Date 2025-06-18 PM 6:37*/
public enum OrderState {UNPAID,         // 待支付PAID,           // 已支付SHIPPED,        // 已发货CONFIRMED,      // 已确认收货CANCELLED       // 已取消
}

2.3 Spring 事件监听器

Spring 事件监听器,用于异步处理事件流,当状态机结束时,推送当前状态机到监听器,监听器则从持久化中删除该状态机

package org.example.config;import org.example.entity.OrderSMContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;/*** @Author zhx && moon* @Since 21* @Date 2025-06-20 AM 10:18*/
@Component
public class AsyncEventListener {Logger logger = LoggerFactory.getLogger(this.getClass());@AutowiredSMContainer smContainer;@Async@EventListenerpublic void handleAsyncEvent(OrderSMContext context) {logger.info("order id {} has delete {}", context.getOrderId(), smContainer.delete(context.getOrderId()));}}

2.4 状态机持久化类

利用 Redis 做状态机的持久化存储

2.4.1 Redis 状态机持久化容器

package org.example.config;import org.example.common.OrderEvent;
import org.example.common.OrderState;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.statemachine.data.redis.RedisStateMachineContextRepository;
import org.springframework.statemachine.persist.RepositoryStateMachinePersist;
import org.springframework.stereotype.Component;/*** @Author zhx && moon* @Since 21* @Date 2025-06-18 PM 6:54*/
@Component
public class MYRedisPerSisterConfig {@Autowiredprivate RedisConnectionFactory factory;/*** 创建 RedisStateMachineRepository 实例*/@Bean(name = "redisStateMachineContextRepository")public MYRedisStateMachinePer<OrderState, OrderEvent> getRedisPerSister() {// 创建 RedisStateMachineRepository 实例RedisStateMachineContextRepository<OrderState, OrderEvent> repository = new RedisStateMachineContextRepository<>(factory);// 持久化RepositoryStateMachinePersist perSister = new RepositoryStateMachinePersist(repository);// 获取 Redis StateMachinePerSister 实例MYRedisStateMachinePer machine = new MYRedisStateMachinePer<>(perSister);RedisTemplate<String, byte[]>  redisTemplate = createDefaultTemplate(factory);machine.setRedisTemplate(redisTemplate);// 返回return machine;}/*** 与 RedisStateMachineContextRepository 使用相同的序列化配置* @param connectionFactory* @return*/private static RedisTemplate<String, byte[]> createDefaultTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, byte[]> template = new RedisTemplate();template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());template.setConnectionFactory(connectionFactory);template.afterPropertiesSet();return template;}
}

2.4.2 Redis 配置

package org.example.config;import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.statemachine.StateMachinePersist;
import org.springframework.statemachine.data.redis.RedisStateMachinePersister;/*** @Author zhx && moon* @Since 21* @Date 2025-06-19 PM 5:21*/
public class MYRedisStateMachinePer<S, E> extends RedisStateMachinePersister<S, E> {RedisTemplate<String, byte[]> redisTemplate;public MYRedisStateMachinePer(StateMachinePersist<S, E, String> stateMachinePersist) {super(stateMachinePersist);}public void setRedisTemplate(RedisTemplate<String, byte[]> redisTemplate){this.redisTemplate = redisTemplate;}/*** 检查 Redis 中是否存在指定的 key* @param key* @return*/public boolean isUnExist(String key){return !this.redisTemplate.hasKey(key);}/*** 删除 Redis 中指定的 key* @param key* @return*/public boolean deleteKey(String key){return this.redisTemplate.delete(key);}}

2.4.3 状态机监听器

用于监听状态机状态变化

package org.example.config;import org.example.common.OrderEvent;
import org.example.common.OrderState;
import org.example.entity.OrderSMContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.messaging.Message;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.listener.StateMachineListenerAdapter;
import org.springframework.statemachine.state.State;
import org.springframework.stereotype.Component;/*** @Author zhx && moon* @Since 21* @Date 2025-06-19 PM 4:58*/
@Component
public class RedStateMachineListener extends StateMachineListenerAdapter<OrderState, OrderEvent> {Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate ApplicationEventPublisher publisher;/*** 状态变化* @param from* @param to*/@Overridepublic void stateChanged(State<OrderState, OrderEvent> from, State<OrderState, OrderEvent> to) {// 状态变更时的处理if (null == from) {logger.info("state machine init, from Init to {}", to.getId());} else {logger.info("state machine change, from {} to {}", from.getId(), to.getId());}}/*** 状态机启动成功时的回调* @param sm*/@Overridepublic void stateMachineStarted(StateMachine<OrderState, OrderEvent> sm) {logger.info("state machine {} start success.", sm.getId());}/*** 状态机结束的回调* @param sm*/@Overridepublic void stateMachineStopped(StateMachine<OrderState, OrderEvent> sm) {logger.info("state machine {} stop success.", sm.getId());publisher.publishEvent(new OrderSMContext(sm.getId()));}@Overridepublic void eventNotAccepted(Message<OrderEvent> event) {logger.error("Event not accepted: {}", event.getPayload());}}

2.5 装机器容器

用于管理状态机的创建,本地化缓存与持久化存储

package org.example.config;import org.example.common.OrderEvent;
import org.example.common.OrderState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.config.StateMachineFactory;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;
import java.util.Objects;/*** @Author zhx && moon* @Since 21* @Date 2025-06-19 PM 4:30*/
@Component
public class SMContainer {Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate StateMachineFactory<OrderState, OrderEvent> factory;@Autowiredprivate MYRedisStateMachinePer<OrderState, OrderEvent> myRedisStateMachinePer;private Map<String, StateMachine<OrderState, OrderEvent>> map = new HashMap<>(16);/*** 获取状态机* @param orderId 订单ID* @return 状态机实例*/public synchronized StateMachine<OrderState, OrderEvent> getStateMachine(String orderId) {String key = getKey(orderId);try {// 取缓存StateMachine<OrderState, OrderEvent> sm = map.get(orderId);// 校验if (Objects.isNull(sm)) {// 获取状态机实例sm = factory.getStateMachine(orderId);// 校验是否存在if (myRedisStateMachinePer.isUnExist(key)) {sm.startReactively().subscribe();myRedisStateMachinePer.persist(sm, key);} else {// 恢复状态myRedisStateMachinePer.restore(sm, key);}// 缓存状态机map.put(orderId, sm);}return sm;} catch (Exception e) {logger.error("get state machine error: {}", e.getMessage(), e);return null;}}/*** 保存状态机* @param orderId* @param stateMachine*/public synchronized boolean save(StateMachine<OrderState, OrderEvent> stateMachine, String orderId){try {String key = getKey(orderId);myRedisStateMachinePer.persist(stateMachine, key);return true;} catch (Exception e) {logger.error("save state machine error: {}", e.getMessage(), e);return false;}}/*** 删除状态机* @param orderId* @return*/public synchronized boolean delete(String orderId){return myRedisStateMachinePer.deleteKey(getKey(orderId));}/*** 获取 KEY* @param orderId* @return*/private String getKey(String orderId){return "STATE-MACHINE:" +orderId;}}

2.6 状态机事件发送器

用于统一发送状态机事件,管理事件发送过程

package org.example.config;import org.example.common.OrderEvent;
import org.example.common.OrderState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.StateMachineEventResult;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;import java.util.concurrent.atomic.AtomicBoolean;/*** @Author zhx && moon* @Since 21* @Date 2025-06-20 PM 2:22*/
@Component
public class SMEventSender {Logger logger = LoggerFactory.getLogger(this.getClass());@AutowiredSMContainer smContainer;/*** 初始化订单状态机* @param orderId*/public void initOrderStateMachine(String orderId) {smContainer.getStateMachine(orderId);}/*** 发送事件* @param orderId* @param event* @return*/public boolean send(String orderId, OrderEvent event) {// 获取状态StateMachine<OrderState, OrderEvent> sm = smContainer.getStateMachine(orderId);// 构建事件消息Message<OrderEvent> message = MessageBuilder.withPayload(event).setHeader("orderId", orderId) // 订单对象关联状态机.build();// 发送事件AtomicBoolean result = new AtomicBoolean(false);sm.sendEvent(Mono.just(message)).subscribe(r->{if (r.getResultType() == StateMachineEventResult.ResultType.ACCEPTED) {// 成功result.set(true);// 在未完成时持久化if (!OrderEvent.CONFIRM.equals(event)) {smContainer.save(sm, orderId);}} else {result.set(false);}});// 输出logger.info("send event: {}, orderId: {}, result: {}", event, orderId, result.get());// 返回return result.get();}}

2.7 状态机配置

状态机配置,定义事件和状态关系,以及守卫和动作

package org.example.config;import org.example.common.OrderEvent;
import org.example.common.OrderState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachineFactory;
import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;import java.util.EnumSet;/*** @Author zhx && moon* @Since 21* @Date 2025-06-18 PM 6:38*/
@Configuration
@EnableStateMachineFactory
public class StateMachineConfig extends StateMachineConfigurerAdapter<OrderState, OrderEvent> {Logger logger = LoggerFactory.getLogger(this.getClass());@AutowiredRedStateMachineListener listener;@Overridepublic void configure(StateMachineConfigurationConfigurer<OrderState, OrderEvent> config) throws Exception {config.withConfiguration()// 注册监听器.listener(listener);}/*** 状态机初始化* @param states* @throws Exception*/@Overridepublic void configure(StateMachineStateConfigurer<OrderState, OrderEvent> states) throws Exception {states.withStates().initial(OrderState.UNPAID).states(EnumSet.allOf(OrderState.class)).end(OrderState.CONFIRMED).end(OrderState.CANCELLED);}/*** 状态转移逻辑* @param transitions* @throws Exception*/@Overridepublic void configure(StateMachineTransitionConfigurer<OrderState, OrderEvent> transitions) throws Exception {transitions// 支付:UNPAID -> PAID.withExternal().source(OrderState.UNPAID).target(OrderState.PAID).guard(context -> {// (前置)守卫条件,校验支付结果logger.info("check order {} pay result ...", context.getMessageHeader("orderId"));return true;}).action(context -> {// (后置)触发动作,通知仓库备货logger.info("order {} pay success, notify warehouse to prepare goods ...", context.getMessageHeader("orderId"));}).event(OrderEvent.PAY).and()// 发货:PAID -> SHIPPED.withExternal().source(OrderState.PAID).target(OrderState.SHIPPED).event(OrderEvent.SHIP).and()// 确认收货:SHIPPED -> CONFIRMED.withExternal().source(OrderState.SHIPPED).target(OrderState.CONFIRMED).event(OrderEvent.CONFIRM).and()// 取消订单(仅在待支付可取消).withExternal().source(OrderState.UNPAID).target(OrderState.CANCELLED).event(OrderEvent.CANCEL);}}

2.8 接口类

用于模拟订单操作

package org.example.controller;import org.example.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author zhx && moon* @Since 21* @Date 2025-06-18 PM 6:41*/
@RestController
@RequestMapping("/orders")
public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("/create")public String create() {return orderService.createOrder();}@GetMapping("/pay/{orderId}")public String pay(@PathVariable("orderId") String orderId) {return orderService.payOrder(orderId);}@GetMapping("/shipped/{orderId}")public String shipped(@PathVariable("orderId") String orderId) {return orderService.shipped(orderId);}@GetMapping("/confirm/{orderId}")public String confirm(@PathVariable("orderId") String orderId) {return orderService.confirm(orderId);}@GetMapping("/{orderId}/status")public String status(@PathVariable String orderId) {return "当前状态: " + orderService.getOrderState(orderId);}}

2.9 实现类

package org.example.service;import org.example.common.OrderEvent;
import org.example.common.OrderState;
import org.example.config.SMEventSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @Author zhx && moon* @Since 21* @Date 2025-06-18 PM 6:40*/
@Service
public class OrderService {@AutowiredSMEventSender smEventSender;/*** 创建订单并初始化状态机* @return*/public String createOrder() {try {// 使用时间戳作为订单IDString orderId = String.valueOf(System.currentTimeMillis());// 初始化smEventSender.initOrderStateMachine(orderId);// 返回订单IDreturn orderId;} catch (Exception e) {return e.getMessage();}}/*** 支付* @param orderId* @return*/public String payOrder(String orderId) {try {boolean result = smEventSender.send(orderId, OrderEvent.PAY);return "success:" + result;} catch (Exception e) {return e.getMessage();}}/*** 发货* @param orderId* @return*/public String shipped(String orderId) {try {boolean result = smEventSender.send(orderId, OrderEvent.SHIP);return "success:" + result;} catch (Exception e) {return e.getMessage();}}/*** 确认收货* @param orderId* @return*/public String confirm(String orderId) {try {boolean result = smEventSender.send(orderId, OrderEvent.CONFIRM);return "success:" + result;} catch (Exception e) {return e.getMessage();}}public OrderState getOrderState(String orderId) {return OrderState.UNPAID;}
}

2.10 状态机上下文

用于管理状态机信息

package org.example.entity;import org.example.common.OrderState;import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;/*** @Author zhx && moon* @Since 21* @Date 2025-06-18 PM 6:54*/
public class OrderSMContext {public OrderSMContext(String orderId){this.orderId = orderId;}private String orderId;private OrderState currentState;private Map<String, Object> extendedState = new HashMap<>();private LocalDateTime createdAt;private LocalDateTime lastModifiedAt;public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}
}

2.11 配置文件

spring:data:redis:database: 0host: 192.168.1.103port: 6379password: 123456timeout: 5000

3.状态机测试

3.1创建订单

在这里插入图片描述

3.2持久化结果

初始化时自动将数据持久化到 Redis

在这里插入图片描述

3.3 支付订单

在这里插入图片描述

3.4 发货

在这里插入图片描述

3.5 确认收货

在这里插入图片描述

后台日志

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89095.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89095.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89095.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战四:基于PyTorch实现猫狗分类的web应用【2/3】

​一、需求描述 实战四分为三部分来实现&#xff0c;第二部分是基于PyTorch的猫狗图像可视化训练的教程&#xff0c;实现了一个完整的猫狗分类模型训练流程&#xff0c;使用预训练的ResNet50模型进行迁移学习&#xff0c;并通过SwanLab进行实验跟踪。 效果图 ​二、实现思路 …

对比几个测试云的一些速度

最近被hosting vps主机的速度给困扰了&#xff0c;干脆放下手中的活 测试下 test.php放在网站根目录即可 代码如下&#xff1a; <?php /*** 最终版服务器性能测试工具* 测试项目&#xff1a;CPU运算性能、内存读写速度、硬盘IO速度、网络下载速度*/// 配置参数&#xff…

UE5 Grid3D 学习笔记

一、Neighbor Grid 3D 的核心作用 NeighborGrid3D 是一种基于位置的哈希查找结构&#xff0c;将粒子按空间位置划分到网格单元&#xff08;Cell&#xff09;中&#xff0c;实现快速邻近查询&#xff1a; 空间划分&#xff1a;将模拟空间划分为多个三维网格单元&#xff08;Cel…

Spring AI ——在springboot应用中实现基本聊天功能

文章目录 前言测试环境项目构建依赖引入指定openai 相关配置基于 application.yml 配置 Open AI 属性application.yml编写测试类测试请求基于读取后配置请求编写测试接口测试效果展示流式输出前言 AI 技术越来越火爆,作为Java开发人员也不能拖了后腿。 前段时间使用LangChain…

条件概率:不确定性决策的基石

条件概率是概率论中的核心概念&#xff0c;用于描述在已知某一事件发生的条件下&#xff0c;另一事件发生的概率。它量化了事件之间的关联性&#xff0c;是贝叶斯推理、统计建模和机器学习的基础。 本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术…

搭建Flink分布式集群

1. 基础环境&#xff1a; 1.1 安装JDK 本次使用 jdk-11.0.26_linux-x64_bin.tar.gz 解压缩 tar -zxvf jdk-11.0.26_linux-x64_bin.tar.gz -C /usr/local/java/ 配置环境变量&#xff1a; vi /etc/profileJAVA_HOME/usr/local/java/jdk-11.0.26 CLASSPATH.:${JAVA_HOME}/li…

基于ssm校园综合服务系统微信小程序源码数据库文档

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;校园综合服务被用户普遍使用&#xff0c;为方便用户能够可…

桌面小屏幕实战课程:DesktopScreen 17 HTTPS

飞书文档http://https://x509p6c8to.feishu.cn/docx/doxcn8qjiNXmw2r3vBEdc7XCBCh 源码参考&#xff1a; /home/kemp/work/esp/esp-idf/examples/protocols/https_request 源码下载方式参考&#xff1a; 源码下载方式 获取网站ca证书 openssl s_client -showcerts -connec…

uniapp上传gitee

右键点击项目&#xff0c;选择git提交&#xff0c;会弹出这样的弹窗 在Message输入框里面输入更新的内容&#xff0c;选择更新过的文件&#xff0c;然后点击commit 然后点击push 后面会让你填写gitee的用户名和密码 用户名就是邮箱 密码就是登录gitee的密码

重写(Override)与重载(Overload)深度解析

在Java面向对象编程中&#xff0c;多态性是一个核心概念&#xff0c;它允许我们以统一的方式处理不同类型的对象。而实现多态性的两种重要机制便是方法的“重写”&#xff08;Override&#xff09;与“重载”&#xff08;Overload&#xff09;。透彻理解这两者之间的区别与联系…

Go 语言中操作 SQLite

sqlite以其无需安装和配置&#xff1a;直接使用数据库文件&#xff0c;无需启动独立的数据库服务进程。 单文件存储&#xff1a;整个数据库&#xff08;包括表、索引、数据等&#xff09;存储在单个跨平台文件中&#xff0c;便于迁移和备份。 在应对的小型应用软件中.有着不可…

【硬核数学】2.3 AI的“想象力”:概率深度学习与生成模型《从零构建机器学习、深度学习到LLM的数学认知》

欢迎来到本系列的第八篇文章。在前七章中&#xff0c;我们已经构建了一个强大的深度学习工具箱&#xff1a;我们用张量来处理高维数据&#xff0c;用反向传播来高效地计算梯度&#xff0c;用梯度下降来优化模型参数。我们训练出的模型在分类、回归等任务上表现出色。 但它们有…

华为云Flexus+DeepSeek征文|Dify平台开发搭建口腔牙科24小时在线问诊系统(AI知识库系统)

引言&#xff1a;为什么需要口腔牙科24小时在线问诊系统&#xff1f; 在口腔医疗领域&#xff0c;“时间”是患者最敏感的需求之一——深夜牙齿突发疼痛、周末想提前了解治疗方案、异地患者无法及时到院……传统“工作时间在线”的咨询模式已无法满足用户需求。同时&#xff0…

嵌入式硬件中电容的基本原理与详解

大家好我们今天重讨论点知识点如下: 1.电容在电路中的作用 2.用生活中水缸的例子来比喻电容 3.电容存储能力原理 4.电容封装的种类介绍电容种类图片辨识 5.X 电容的作用介绍 6.Y 电容的作用介绍7.钽电容的优点及特性 7.钽电容的缺点及特性 8. 铝电解电容的优点及特性…

中央空调控制系统深度解析:从原理到智能AIOT运维

——附水冷式系统全电路图解与技术参数 一、中央空调系统架构与技术演进 1. 两大主流系统对比 技术趋势&#xff1a;2023年全球冷水机组市场占比达68%&#xff08;BSRIA数据&#xff09;&#xff0c;其核心优势在于&#xff1a; - 分区控温精度&#xff1a;0.5℃&#…

document.write 和 innerHTML、innerText 的区别

document.write 与 innerHTML、innerText 的区别 document.write 直接写入 HTML 文档流&#xff0c;若在页面加载完成后调用会覆盖整个文档。常用于动态生成内容&#xff0c;但会破坏现有 DOM 结构&#xff0c;不推荐在现代开发中使用。 document.write("<p>直接写…

日志分析与实时监控:Elasticsearch在DevOps中的核心作用

引言 在现代DevOps实践中&#xff0c;日志分析与实时监控是保障系统稳定性与性能的关键。Elasticsearch作为分布式搜索与分析引擎&#xff0c;凭借其高效的索引与查询能力&#xff0c;成为构建日志管理与监控系统的核心组件。本文将深入探讨Elasticsearch在DevOps中的应用&…

Unity Catalog 三大升级:Data+AI 时代的统一治理再进化

在刚刚落幕的 2025 Databricks Data AI Summit 上&#xff0c;Databricks 重磅发布了多项 Lakehouse 相关功能更新。其中&#xff0c;面向数据湖治理场景的统一数据访问与管理方案 —— Unity Catalog&#xff0c;迎来了三大关键升级&#xff1a;全面支持 Apache Iceberg、面向…

电容屏触摸不灵敏及跳点问题分析

在电容屏的使用过程中&#xff0c;触摸不灵敏和触点不精准是极为常见且让人困扰的问题。这些问题不仅影响用户的操作体验&#xff0c;在一些对触摸精度要求较高的场景&#xff0c;如工业控制、绘图设计等领域&#xff0c;还可能导致严重的后果。下面我们就来深入剖析一下这两个…

小程序学习笔记:导航、刷新、加载、生命周期

在小程序开发的领域中&#xff0c;掌握视图与逻辑相关的技能是打造功能完备、用户体验良好应用的关键。今天&#xff0c;咱们就来深入梳理一下小程序视图与逻辑的学习要点&#xff0c;并结合代码示例&#xff0c;让大家有更直观的理解。 一、页面之间的导航跳转 在小程序里实…