【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
最近 Spring 家族又填新丁 —— Spring Statemachine,Spring 状态机:
Spring Statemachine 1.0.0 Released http://spring.io/blog/2015/10/13/spring-statemachine-1-0-0-released
Spring Statemachine Homepage http://projects.spring.io/spring-statemachine/
之所以介绍这个项目是因为状态机是一个解决某些复杂逻辑的不错的选择。之前在做一个即时通信项目的时候就大量使用了状态机的设计。原因也很简单,就是系统中存在大量各式各样的状态,以及能使系统在这些状态之间转换的事件。采用状态机的设计便是自然而然的事情。
但是当时我们项目的状态机实现并不好,复杂笨重。其中一个缺点是,状态转换的定义语法复杂,可读性差。但无奈当时市面上并没有太好的通用的状态机框架可供使用。后来无意间发现了 Apache Mina 中的状态机实现其实还不错,用法简单。所以后来就参考 Mina 实现了一个可用 Annotation 定义事件 Transaction 的状态机实现,并用它改进项目中设计。当然后来因为换工作,这些改进就没有继续。
当然,用 Annotation 定义状态机流转有一个很大的缺点是没有一个统一的地方可以定义状态的转换。如果项目实现发展,同时又缺乏良好的编码规范和文档,那状态转换的这部分逻辑就变得难以跟踪了。
Spring Statemachine 使用的是 DSL 和 Annotation 相结合的方式定义状态转换规则:
状态转换定义:
@Configuration
@EnableStateMachine
static class Config1 extends EnumStateMachineConfigurerAdapter<States, Events> {
@Override
public void configure(StateMachineStateConfigurer<States, Events> states)
throws Exception {
states
.withStates()
.initial(States.STATE1)
.states(EnumSet.allOf(States.class));
}
@Override
public 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.STATE1)
.event(Events.EVENT2);
}
}
状态机:
@WithStateMachine
static class MyBean {
@OnTransition(target = "STATE1")
void toState1() {
}
@OnTransition(target = "STATE2")
void toState2() {
}
}
Spring Statemachine 设计的好坏目前还不好做判断,因为目前我暂时没有项目需要采用状态机设计。如果各位有需要状态机设计的可以考虑采用 Spring Statemachine。而且这是一个新项目,如果深入使用它会有很多机会提交 patch 甚至直接参与的机会。
来源:oschina
链接:https://my.oschina.net/u/1158769/blog/517961