栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-09

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-09

Spring状态机的方法详解

文章目录
    • Spring状态机的方法详解
  • 前言
  • 一、类似于链式编程结构分析
  • 二、状态机拦截器
  • 三、常见方法总结
  • 总结


前言

Spring状态机的作为一套系统,当我们了解到基本概念和电商平台的实例后,我们更需要关注底层的规律,方法,从而丰富我们的知识,其实一切程序最终都归于底层研究,我们要了解每一个方法的使用和出处。这样在具体项目中,我们才能将具体的业务重写。


一、类似于链式编程结构分析

案例一:

@Override
	public void configure(StateMachineTransitionConfigurer transitions) throws Exception {
		//source 源状态 target 目标状态 event 由这个事件触发 withExternal 获取外部转换的配置程序
		transitions
			.withExternal()
				.source(1).target(2).event(click1)
				.and()
			.withExternal()
				.source(2).target(1).event(click2)
	}
}
//可以通过click1事件,由状态1变为状态2;通过click2事件,由状态2变为状态1。StateMachineTransitionConfigurer配置接口从而实现不同类型的转换。

案例二:

@Configuration
@EnableStateMachine
public class Config
        extends EnumStateMachineConfigurerAdapter {

    @Override
    public void configure(StateMachineStateConfigurer states)
            throws Exception {
        states
            .withStates()
                .initial(States.S1, action())
                .state(States.S1, action(), null)
                .state(States.S2, null, action())
                .state(States.S2, action())
                .state(States.S3, action(), action());
                //将初始状态S1和S2,S3等状态相关联
    }

    @Bean
    public Action action() {
        return new Action() {

            @Override
            public void execute(StateContext context) {
                // do things as you like
            }
        };
    }

}

在上面,单个Action被定义为bean操作并与状态S1,S2和S3关联。 还有更多的事情需要更多的澄清:
我们定义了初始状态S1的动作。
我们为状态S1定义了进入动作,并且退出动作为空。
我们为状态S2定义了退出动作,并且将进入动作留空。
我们为状态S2定义了一个单独的状态动作。
我们为状态S3定义了一个单进入动作和退出动作
注意状态S1是如何在initial()和state()函数中使用两次的。 这只有在你想用初始状态定义进入或退出动作时才需要。

二、状态机拦截器
stateMachine.getStateMachineAccessor()
    .withRegion().addStateMachineInterceptor(new StateMachineInterceptor() {

        @Override
        public Message preEvent(Message message, StateMachine stateMachine) {
            return message;
        }

        @Override
        public StateContext preTransition(StateContext stateContext) {
            return stateContext;
        }

        @Override
        public void preStateChange(State state, Message message,
                Transition transition, StateMachine stateMachine) {
        }

        @Override
        public StateContext postTransition(StateContext stateContext) {
            return stateContext;
        }

        @Override
        public void postStateChange(State state, Message message,
                Transition transition, StateMachine stateMachine) {
        }

        @Override
        public Exception stateMachineError(StateMachine stateMachine,
                Exception exception) {
            return exception;
        }
    });

拦截器可以用来拦截和停止当前的状态变化或转换逻辑,因为一个状态有着前后状态,因此需要拦截前后状态的变化和转换,在转换时我们要获取上下文;在状态变化时,转换是一种必要的输入。


三、常见方法总结

1.Region接口
UUID getUuid();
String getId();
State getState();
Collection> getStates();
Collection> getTransitions();

2.抽象类 Enum.java,实现比较功能和序列化功能
final String name;

3.String.java
boolean startsWith(String prefix)

总结

Spring状态机作为一种状态转换的工具,避免了我们使用if-else结构去转换状态,而且代码的可维护性得到了增强。熟练掌握一块知识,从概念到实例,然后再到具体的模块,深化下来就是底层的方法,作为一名程序员,在如今情况下我们前人已经创建了满足业务需求的代码语言和框架,我们必须熟知其中的方法,才能更好地和我们的业务更好地结合。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/305841.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号