17. 流继承

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

为了找到父流,必须像任何其他流一样将其添加到 中。flow-registryspring-doc.cn

17.1. 流继承与 Java 继承相似吗?

流继承类似于 Java 继承,因为父级中定义的元素是通过子级公开的。 但是,存在关键差异。spring-doc.cn

子流无法覆盖父流中的元素。 父流和子流之间的类似元素将合并。 父流中的唯一元素将添加到子流中。spring-doc.cn

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

17.2. 流继承的类型

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

17.2.1. 流级继承

流级别继承由元素上的属性定义。 该属性包含要从中继承的流标识符的逗号分隔列表。 子流按其列出顺序从每个父流继承,并将元素和内容添加到生成的流中。 第一次合并的结果流被视为第二次合并中的子流,依此类推。parentflowspring-doc.cn

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

17.3. 状态级继承

状态级继承类似于流级继承,不同之处在于只有一个状态继承自父级,而不是整个流。spring-doc.cn

与流继承不同,只允许一个父级。 此外,还必须定义要从中继承的流状态的标识符。 流的标识符和该流中的状态由字符分隔。#spring-doc.cn

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

<view-state id="child-state" parent="parent-flow#parent-view-state">
流级继承的目的是定义要添加到多个流定义并在多个流定义之间共享的常见状态,而状态级继承的目的是从单个父状态扩展并与之合并。 流级继承非常适合组合和多重继承,但是,在状态级别,您仍然只能从单个父状态继承。

17.4. 抽象流

通常,父流不是为直接运行而设计的。 为了防止这些流运行,可以将它们标记为 . 如果抽象流尝试运行,则会引发 a。abstractFlowBuilderExceptionspring-doc.cn

<flow abstract="true">

17.5. 继承算法

当子流从其父流继承时,父流和子流将合并在一起以创建新流。 Web 流定义语言中的每个元素都有规则,用于控制该特定元素的合并方式。spring-doc.cn

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

  • 可合并:如果元素相似,则可合并元素始终尝试合并在一起。spring-doc.cn

  • 不可合并:父流或子流中的不可合并元素始终完整地包含在结果流中。 它们不会作为合并过程的一部分进行修改。spring-doc.cn

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

17.5.1. 可合并元素

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

在大多数情况下,从父流添加的元素会添加到子流中的元素之后。 此规则的例外情况包括在开头添加的操作元素 (、 和 )。 这允许子操作使用父操作的结果。evaluaterendersetspring-doc.cn

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

17.5.2. 不可合并的元素

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