当前位置: 首页 > news >正文

技术周总结 01.13~01.19 周日(Spring Visual Studio git)

文章目录

  • 一、01.14 周二
    • 1.1)问题01:Spring的org.springframework.statemachine.StateMachine 是什么,怎么使用?:
      • 如何使用`StateMachine`:
    • 1.2)问题02:Spring StateMachine 提供了一系列高级特性
  • 二、01.16 周四
    • 2.1)问题01:windows中的 git GUI中打开文件中文乱码怎么处理,git bash打开的中文不乱码
    • 2.2)问题02:Visual Studio 有哪些使用技巧
    • 2.3)问题03: git fetch和 git pull的区别
    • 2.4) Visual Studio的使用教程

一、01.14 周二

1.1)问题01:Spring的org.springframework.statemachine.StateMachine 是什么,怎么使用?:

org.springframework.statemachine.StateMachine 是Spring框架中的一个组件,用于实现状态机的功能。状态机是一个抽象机器,它可以处于有限个状态之一。状态机可以根据触发的事件(transitions)从一个状态转移到另一个状态。

状态机通常用于实现具有明确状态和状态转换的系统,例如工作流引擎、订单管理系统、游戏控制逻辑等。Spring StateMachine 提供了一个框架,使得在Spring应用程序中实现状态机变得容易和直观。

如何使用StateMachine

  1. 定义状态和事件
    首先,你需要定义状态机可能处于的状态(State)以及可能触发转换的事件(Event)。这些通常通过枚举来实现。

    public enum States {STATE1, STATE2, STATE3
    }public enum Events {EVENT1, EVENT2, EVENT3
    }
    
  2. 配置状态机
    接下来,你需要配置状态机,定义状态之间的转换逻辑。这通常在配置类中完成,使用Spring StateMachine的配置适配器。

    @Configuration
    @EnableStateMachine
    public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> {@Overridepublic void configure(StateMachineStateConfigurer<States, Events> states)throws Exception {states.withStates().initial(States.STATE1).state(States.STATE2).end(States.STATE3);}@Overridepublic void configure(StateMachineTransitionConfigurer<States, Events> transitions)throws Exception {transitions.withExternal().source(States.STATE1).target(States.STATE2).event(Events.EVENT1).and().withExternal().source(States.STATE2).target(States.STATE3).event(Events.EVENT2);}
    }
    

    在这个配置中,我们定义了一个初始状态STATE1,以及在EVENT1发生时从STATE1转移到STATE2,以及在EVENT2发生时从STATE2转移到STATE3的转换。

  3. 使用状态机
    一旦状态机被配置,你可以在你的服务或组件中注入StateMachine对象,并使用它来管理状态。

    @Service
    public class MyService {@Autowiredprivate StateMachine<States, Events> stateMachine;public void doSomething() {stateMachine.start();stateMachine.sendEvent(Events.EVENT1);stateMachine.sendEvent(Events.EVENT2);stateMachine.stop();}
    }
    

    在这个服务中,我们启动状态机,发送事件来触发状态转换,并在完成后停止状态机。

Spring StateMachine还提供了许多高级特性,包括状态监听器、状态机持久化、状态机拦截器等。通过这些特性,你可以构建复杂的状态管理逻辑,以适应各种应用场景的需求。

1.2)问题02:Spring StateMachine 提供了一系列高级特性

Spring StateMachine 提供了一系列高级特性,可以帮助你更好地管理和扩展状态机的行为。下面是其中一些高级特性的详细说明:

  1. 状态监听器(State Listeners)
    状态监听器允许你在状态机的状态变化时执行自定义的逻辑。你可以监听状态的变化、事件的发生、以及转换的发生。通过实现 StateListenerAdapterStateMachineListener 接口,可以创建自己的监听器。

    @Override
    public void configure(StateMachineConfigurationConfigurer<States, Events> config)throws Exception {config.withConfiguration().listener(new StateMachineListenerAdapter<States, Events>() {@Overridepublic void stateChanged(State<States, Events> from, State<States, Events> to) {// 自定义逻辑}});
    }
    
  2. 状态机持久化(State Machine Persistence)
    状态机持久化允许你将状态机的状态存储在持久化存储(如数据库)中,这样即使应用程序重启,状态机也能恢复到之前的状态。Spring StateMachine 提供了持久化接口,你可以通过实现 StateMachinePersist 接口来自定义持久化逻辑。

    public class MyStateMachinePersist implements StateMachinePersist<States, Events, String> {// 实现读取和写入状态机的方法
    }
    
  3. 状态机拦截器(State Machine Interceptors)
    状态机拦截器可以在状态机转换发生之前或之后执行自定义逻辑。通过实现 StateMachineInterceptor 接口,可以拦截状态机的各种事件。

    @Override
    public void configure(StateMachineConfigurationConfigurer<States, Events> config)throws Exception {config.withConfiguration().withInterceptor(new StateMachineInterceptorAdapter<States, Events>() {@Overridepublic void preStateChange(State<States, Events> state, Message<Events> message,Transition<States, Events> transition, StateMachine<States, Events> stateMachine) {// 转换前的逻辑}});
    }
    
  4. 状态机区域(State Machine Regions)
    对于更复杂的场景,一个状态机可以分成多个区域(Region),每个区域有自己的状态和转换,这些区域可以并行运行。这对于同时管理多个独立但相关的状态机非常有用。

  5. 状态机触发器(State Machine Triggers)
    触发器是状态转换的另一种机制,它可以基于时间或其他条件自动触发状态转换,而不是基于事件。

  6. 状态机动作(State Machine Actions)
    状态机的转换可以关联动作(Action),这些动作在转换发生时执行。动作可以用于执行业务逻辑,比如发送通知、更新数据库等。

  7. 状态机守卫(State Machine Guards)
    守卫是一种条件逻辑,决定是否可以执行特定的状态转换。守卫可以用于检查业务规则,确保只有在特定条件满足时才允许状态转换。

通过这些高级特性,Spring StateMachine 提供了灵活和强大的机制来处理状态管理,并允许你根据具体的业务需求定制状态机的行为。这些特性可以单独使用,也可以组合使用,以提供更复杂的状态管理解决方案。

二、01.16 周四

2.1)问题01:windows中的 git GUI中打开文件中文乱码怎么处理,git bash打开的中文不乱码

git config --global gui.encoding utf-8
git config --global i18n.commit.encoding utf-8
git config --global i18n.logoutputencoding utf-8

2.2)问题02:Visual Studio 有哪些使用技巧

F5: 快速启动调试

2.3)问题03: git fetch和 git pull的区别

git fetch 是抓取远程的内容到本地,但是不自动合并到当前的分支
git pull 则是获取远程当前分支的内容,并自动与当前分支合并
git pull = git fetch + git merge

2.4) Visual Studio的使用教程

https://learn.microsoft.com/zh-cn/visualstudio/get-started/csharp/run-program?view=vs-2022

相关文章:

技术周总结 01.13~01.19 周日(Spring Visual Studio git)

文章目录 一、01.14 周二1.1&#xff09;问题01&#xff1a;Spring的org.springframework.statemachine.StateMachine 是什么&#xff0c;怎么使用&#xff1f;:如何使用StateMachine&#xff1a; 1.2&#xff09;问题02&#xff1a;Spring StateMachine 提供了一系列高级特性 …...

Linux中使用unzip

安装命令 yum install unzip unzip常用选项和参数 选项 说明 -q 隐藏解压过程中的消息输出 -d /path/to/directory 指定解压文件的目标目录 -P password 如果.zip文件被密码保护&#xff0c;使用此选项可以指定打开文件所需的密码 解压命令 unzip 要解压的压缩包unz…...

Baklib引领内容管理平台新时代优化创作流程与团队协作

内容概要 在迅速变化的数字化时代&#xff0c;内容管理平台已成为各种行业中不可或缺的工具。通过系统化的管理&#xff0c;用户能够有效地组织、存储和共享信息&#xff0c;从而提升工作效率和创意表达。Baklib作为一款新兴的内容管理平台&#xff0c;以其独特的优势和创新功…...

利用Redis实现数据缓存

目录 1 为啥要缓存捏&#xff1f; 2 基本流程&#xff08;以查询商铺信息为例&#xff09; 3 实现数据库与缓存双写一致 3.1 内存淘汰 3.2 超时剔除&#xff08;半自动&#xff09; 3.3 主动更新&#xff08;手动&#xff09; 3.3.1 双写方案 3.3.2 读写穿透方案 3.3.…...

jQuery小游戏(二)

jQuery小游戏&#xff08;二&#xff09; 今天是新年的第二天&#xff0c;本人在这里祝大家&#xff0c;新年快乐&#xff0c;万事胜意&#x1f495; 紧接jQuery小游戏&#xff08;一&#xff09;的内容&#xff0c;我们开始继续往下咯&#x1f61c; 游戏中使用到的方法 key…...

农产品价格报告爬虫使用说明

农产品价格报告爬虫使用说明 # ************************************************************************** # * * # * 农产品价格报告爬虫 …...

xceed PropertyGrid 如何做成Visual Studio 的属性窗口样子

类似这样的&#xff0c;我百度了一下&#xff0c;发现使用Xceed 不错。使用PropertyGrid 前台代码为 <Windowx:Class"WpfApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.co…...

Fork/Join框架_任务分解与并行执行

1 概述 Fork/Join框架是Java 7引入的一个用于并行执行任务的框架。它特别适用于可以递归分解为多个子任务的工作,每个子任务可以独立执行,并且结果可以合并以获得最终结果。Fork/Join框架通过工作窃取(work-stealing)算法提高了多核处理器上的任务执行效率。 2 核心组件 …...

智能家居监控系统数据收集积压优化

亮点&#xff1a;RocketMQ 消息大量积压问题的解决 假设我们正在开发一个智能家居监控系统。该系统从数百万个智能设备&#xff08;如温度传感器、安全摄像头、烟雾探测器等&#xff09;收集数据&#xff0c;并通过 RocketMQ 将这些数据传输到后端进行处理和分析。 在某些情况下…...

详解python的单例模式

单例模式是一种设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。在Python中实现单例模式有多种方法&#xff0c;下面我将详细介绍几种常见的实现方式。 1. 使用模块 Python的模块天然就是单例的&#xff0c;因为模块在第一次导…...

momask-codes 部署踩坑笔记

目录 依赖项 t2m_nlayer8_nhead6_ld384_ff1024_cdp0.1_rvq6ns 推理代码完善&#xff1a; 代码地址&#xff1a; https://github.com/EricGuo5513/momask-codes 依赖项 pip install numpy1.23 matplotlib 必须指定版本&#xff1a;pip install matplotlib3.3.4 t2m_nlayer…...

H3CNE-31-BFD

Bidirectional Forwarding Dection&#xff0c;双向转发检查 作用&#xff1a;毫秒级故障检查&#xff0c;通常结合三层协议&#xff08;静态路由、vrrp、ospf、BGP等&#xff09;&#xff0c;实现链路故障快速检查。 BFD配置示例 没有中间的SW&#xff0c;接口down&#xff…...

蓝桥备赛指南(5)

queue队列 queue是一种先进先出的数据结构。它提供了一组函数来操作和访问元素&#xff0c;但它的功能相对较简单&#xff0c;queue函数的内部实现了底层容器来存储元素&#xff0c;并且只能通过特定的函数来访问和操作元素。 queue函数的常用函数 1.push()函数&#xff1a;…...

讯飞智作 AI 配音技术浅析(一)

一、核心技术 讯飞智作 AI 配音技术作为科大讯飞在人工智能领域的重要成果&#xff0c;融合了多项前沿技术&#xff0c;为用户提供了高质量的语音合成服务。其核心技术主要涵盖以下几个方面&#xff1a; 1. 深度学习与神经网络 讯飞智作 AI 配音技术以深度学习为核心驱动力&…...

MySQL(高级特性篇) 14 章——MySQL事务日志

事务有4种特性&#xff1a;原子性、一致性、隔离性和持久性 事务的隔离性由锁机制实现事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证&#xff08;1&#xff09;REDO LOG称为重做日志&#xff0c;用来保证事务的持久性&#xff08;2&#xff09;UNDO LOG称为回…...

openRv1126 AI算法部署实战之——TensorFlow TFLite Pytorch ONNX等模型转换实战

Conda简介 查看当前系统的环境列表 conda env list base为基础环境 py3.6-rknn-1.7.3为模型转换环境&#xff0c;rknn-toolkit版本V1.7.3&#xff0c;python版本3.6 py3.6-tensorflow-2.5.0为tensorflow模型训练环境&#xff0c;tensorflow版本2.5.0&#xff0c;python版本…...

【Redis】常见面试题

什么是Redis&#xff1f; Redis 和 Memcached 有什么区别&#xff1f; 为什么用 Redis 作为 MySQL 的缓存&#xff1f; 主要是因为Redis具备高性能和高并发两种特性。 高性能&#xff1a;MySQL中数据是从磁盘读取的&#xff0c;而Redis是直接操作内存&#xff0c;速度相当快…...

每日 Java 面试题分享【第 17 天】

欢迎来到每日 Java 面试题分享栏目&#xff01; 订阅专栏&#xff0c;不错过每一天的练习 今日分享 3 道面试题目&#xff01; 评论区复述一遍印象更深刻噢~ 目录 问题一&#xff1a;Java 中的访问修饰符有哪些&#xff1f;问题二&#xff1a;Java 中静态方法和实例方法的区…...

「全网最细 + 实战源码案例」设计模式——桥接模式

核心思想 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;将抽象部分与其实现部分分离&#xff0c;使它们可以独立变化。降低代码耦合度&#xff0c;避免类爆炸&#xff0c;提高代码的可扩展性。 结构 1. Implementation&#xff08;实现类…...

JavaScript 进阶(上)

作用域 局部作用域 局部作用域分为函数作用域和块作用域。 函数作用域&#xff1a; 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问。 总结&#xff1a; 函数内部声明的变量&#xff0c;在函数外部无法被访问 函数的参数也是函数内部的局部变量 …...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...