首页 > 其他分享 >Spring 状态机极简使用

Spring 状态机极简使用

时间:2024-07-28 17:06:12浏览次数:8  
标签:极简 Spring builder 状态机 guard States action

Spring 状态机极简使用

本文不探讨状态机的思想与Spring状态机的架构,仅做快速实现参考。
Spring 状态机官方文档
项目参考代码

基于SpringBoot配置的快速集成案例

maven 依赖配置

<dependency>
    <groupId>org.springframework.statemachine</groupId>
    <artifactId>spring-statemachine-starter</artifactId>
    <version>4.0.0</version>
</dependency>

java代码

@Configuration
@EnableStateMachine
public class Config1Enums
		extends EnumStateMachineConfigurerAdapter<States, Events> {

	@Override
	public void configure(StateMachineStateConfigurer<States, Events> states)
			throws Exception {
		states
			.withStates()
				.initial(States.S1)
				.end(States.SF)
				.states(EnumSet.allOf(States.class));
	}

}

极简自定义集成案例

该案例支持每次以入参状态作为初始状态获取一个新的状态机。可作为最小接入代价状态机使用。


/**
 * 自定义状态机工厂配置
 * <br/>
 * <code>
 * <a href="https://docs.spring.io/spring-statemachine/docs/4.0.0/reference/index.html#devdocs">官方案例参考</a>
 * </code>
 */
@Slf4j
@RequiredArgsConstructor
@Component
public class SimpleStateMachineService {

    public StateMachine<States, Events> getStateMachine(States initStates) throws Exception {

        StateMachineBuilder.Builder<States, Events> builder = StateMachineBuilder.builder();
        builder.configureConfiguration()
                .withConfiguration().autoStartup(true)
                .and()
                .withVerifier().enabled(true);

        builder.configureStates().withStates()
                .initial(initStates)
                .states(EnumSet.allOf(States.class));

        builder.configureTransitions()
                .withExternal()
                .event(E1).source(S1).target(S2)
                .guard(guard())
                .action(action())
                .and()
                .withExternal()
                .event(E2).source(S2).target(S0)
                .guard(guard())
                .action(action());

        return builder.build();

    }

    private Guard<States, Events> guard() {
        return stateModel -> {
            Object data = stateModel.getMessageHeader("data");
            return Boolean.TRUE.equals(data);
        };
    }

    private Action<States, Events> action() {
        return context -> log.info("源状态:{},目标状态:{},事件:{}", context.getSource().getId(), context.getTarget().getId(), context.getEvent());
    }
}
``

标签:极简,Spring,builder,状态机,guard,States,action
From: https://www.cnblogs.com/listjiang/p/18328464

相关文章

  • 实战: SpringBoot中5种增强的方法 : 加解密、脱敏、格式转换、时间时区处理(码到三十五)
    1.使用@JsonSerialize和@JsonDeserialize注解2.全局配置Jackson的ObjectMapper3.使用@ControllerAdvice配合@InitBinder4. 自定义HttpMessageConverter5.使用AOP进行切面编程结语在SpringBoot中,对接口的请求入参和出参进行自定义的增强或者修改,通常有以下......
  • 科普文:springcloud之-Ribbon
    一、SpringCloudRibbon 客户端负载均衡       Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端侧负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。Bibbon 的架构图如下所示:        简单的说,SpringcloudRibbo......
  • SpringBoot 依赖之Validation
    ValidationValidation依赖名称:Validation功能描述:BeanValidationwithHibernatevalidator.使用Hibernate验证器进行Bean验证。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-valid......
  • 【第12章】Spring Cloud之集成 Spring Cloud Gateway
    文章目录前言一、新建项目1.项目结构2.引入依赖3.启动类4.基本配置二、新建配置三、新建服务1.提供者2.消费者四、单元测试1.启动网关服务2.提供者3.消费者总结前言SpringCloudGateway是一个基于SpringFramework5、SpringBoot2和ProjectReactor......
  • 简易版:在 SpringBoot 中设计一个订单号生成系统
     ​博客主页:   南来_北往系列专栏:SpringBoot实战引言要在SpringBoot中设计一个订单号生成系统,你可以按照以下步骤进行:创建一个SpringBoot项目,添加必要的依赖,如spring-boot-starter-web。创建一个订单号生成器类,实现订单号的生成逻辑。可以使用时间戳、随机数......
  • 微信小程序图书馆座位预约管理系统(SpringBoot后端+Vue管理端)附项目源码与配套文档
    目的和意义微信小程序图书馆座位预约管理系统可以对微信小程序图书馆座位预约管理系统信息进行集中管理,可以真正避免传统管理的缺陷。微信小程序图书馆座位预约管理系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和......
  • SpringBoot+Vue电影院售票系统 - 附源码与配套文档
    1.1 研究背景随着互联网技术的迅速发展和普及,人们的生活方式发生了深刻变革,对于文化娱乐消费的需求日益增长,而作为文化消费重要组成部分的电影行业也迎来了前所未有的发展机遇。然而,传统的电影院售票模式,如现场购票、电话预定等,已难以满足现代消费者对便捷性、灵活性和个性......
  • SpringMVC入门案例
    使用Servlet技术开发web程序流程1.创建web工程(Maven结构)2.设置tomcat服务器,加载web工程(tomcat插件)3.导入坐标(Servlet)4.定义处理请求的功能类(UserServlet)5.设置请求映射(配置映射关系)使用SpringMVc技术开发web程序流程1.创建web工程(Maven结构)2.设置tomcat......
  • 毕业设计:基于Springboot的在线小说阅读平台【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SpringBoot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能会员管理:负责用户注册、登录、会员等级划分及用户信......
  • 【免费领源码】Java/Mysql数据库+springboot驾校预约管理系统 25540,计算机毕业设计项
    摘 要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于驾校预约管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了驾校预约管理系统,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性。这种......