17. 流继承

流继承允许一个流继承另一个流的配置。 继承可以在流动和状态两个层面发生。 一个常见的用例是父流定义全局转换和异常处理程序,然后每个子流程可以继承这些设置。spring-doc.cadn.net.cn

为了找到父流,必须将其添加到流量注册,和其他流一样。spring-doc.cadn.net.cn

17.1. 流继承类似于Java继承吗?

流继承类似于 Java 继承,父源中定义的元素通过子节点被暴露。 然而,两者之间存在关键差异。spring-doc.cadn.net.cn

子流不能覆盖父流的元素。 父流和子流之间的类似元素会合并。 父流中的唯一元素被添加到子流中。spring-doc.cadn.net.cn

子流可以继承多个父流。 Java 继承仅限于单一类。spring-doc.cadn.net.cn

17.2. 流继承的类型

Spring Web Flow 有两种类型的继承:spring-doc.cadn.net.cn

17.2.1. 流位继承

流量继承定义为父母属性元素。 该属性包含一个逗号分隔的流标识符列表,供继承。 子流从每个父流按列出的顺序继承,向最终流添加元素和内容。 第一次合并产生的流在第二次合并中被视为子流,依此类推。spring-doc.cadn.net.cn

<flow parent="common-transitions, common-states">

17.3. 国家级继承

状态级继承类似于流级继承,只不过只有一个状态继承父状态,而非整个流程。spring-doc.cadn.net.cn

与流继承不同,只允许单一父继承。 此外,还必须定义可继承的流态标识符。 流的标识符和流中的状态之间用字符分隔。#spring-doc.cadn.net.cn

父态和子态必须属于同一类型。 例如,视图状态不能继承端态,只能继承另一个视图状态。spring-doc.cadn.net.cn

<view-state id="child-state" parent="parent-flow#parent-view-state">
流级继承的意图是定义可添加到多个流定义中并共享的共同状态,而状态级继承的意图是从单一父状态延伸并合并。 流级继承适合组合和多重继承,但在州级,你仍然只能从单一父州继承。

17.4. 抽象流

父流通常并非设计为直接运行。 为了防止这些流动流动,可以标记为抽象. 如果一个抽象流尝试运行,则FlowBuilderException被抛出。spring-doc.cadn.net.cn

<flow abstract="true">

17.5. 继承算法

当子流继承父流时,父流和子流合并以创建新的流。 Web Flow 定义语言中每个元素都有规则,规范该元素如何合并。spring-doc.cadn.net.cn

有两种元素类型:spring-doc.cadn.net.cn

  • 可合并:如果元素相似,可合并元素总是尝试合并。spring-doc.cadn.net.cn

  • 不可合并:父流或子流中的不可合并元素始终完整地包含在最终流程中。 合并过程中不会被修改。spring-doc.cadn.net.cn

父流中通往外部资源的路径应为绝对路径。 当两个流合并时,除非父流和子流处于同一目录,否则相对路径会中断。 合并后,父流中的所有相对路径都相对于子流。

17.5.1. 可合并元素

如果元素类型相同且键位属性相同,则父元素的内容会与子元素合并。 合并算法继续合并合并的父和子元素的每个子元素。 否则,父元素作为新元素添加到子元素中。spring-doc.cadn.net.cn

在大多数情况下,父流添加的元素是在子流程的元素之后添加的。 该规则的例外包括动作元素(评价,呈现设置)这些都被加在开头。 这使得父作的结果可以被子动作使用。spring-doc.cadn.net.cn

可合并元素包括:spring-doc.cadn.net.cn

17.5.2. 不可合并元素

不可合并的元素包括:spring-doc.cadn.net.cn