17. 流程继承

Flow inheritance 让一个 flow 可以继承另一个 flow 的配置。 继承可以在 flow 和 state 两个级别发生。 一个常见的用例是,父 flow 定义全局转换和异常处理程序,然后每个子 flow 可以继承这些设置。spring-doc.cadn.net.cn

为了找到父流程,它必须像任何其他流程一样被添加到 flow-registry 中。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. 流程级继承

Flow level inheritance is defined by the parent attribute on the flow element. The attribute contains a comma-separated list of flow identifiers from which to inherit. The child flow inherits from each parent in the order it is listed, adding elements and content to the resulting flow. The resulting flow from the first merge is considered the child in the second merge, and so on.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. 抽象流程

通常,父流程并不是设计为直接运行的。 为了保护这些流程不被运行,可以将它们标记为abstract。 如果一个抽象流程试图运行,则会抛出FlowBuilderExceptionspring-doc.cadn.net.cn

<flow abstract="true">

17.5. 继承算法

当子流程继承自父流程时,父流程和子流程将合并在一起以创建一个新的流程。 Web 流程定义语言中的每个元素都有相应的规则来决定该特定元素如何进行合并。spring-doc.cadn.net.cn

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

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

  • Non-mergeable:父流程或子流程中的不可合并元素在结果流程中始终保持完整。 它们不会作为合并过程的一部分被修改。spring-doc.cadn.net.cn

父流中的外部资源路径应为绝对路径。 相对路径在两个流合并时会中断,除非父流和子流位于同一目录中。 一旦合并,父流中的所有相对路径将相对于子流。

17.5.1. 可合并元素

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

在大多数情况下,从父流程中添加的元素会添加在子流程的元素之后。 此规则的例外包括在开头添加的动作元素(evaluaterenderset)。 这使得父动作的结果可以被子动作使用。spring-doc.cadn.net.cn

可合并的元素是:spring-doc.cadn.net.cn

17.5.2. 不可合并的元素

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