LiteFlow LiteFlow
💒首页
  • v2.13.2(当前版本)
  • What's New

    • 🌈What' s New In LiteFlow v2.13.2?
  • 历史版本

    • v2.12.X
    • v2.11.X
    • v2.10.X
    • v2.9.X
    • v2.8.X
  • 升级指南

    • 🌈2.13.0升级指南
    • 2.12.4升级指南
    • 2.12.0升级指南
    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
👑LF CLUB社区
  • 常见问题
  • 专题解释

    • 如何理解上下文这个概念?
    • Slot是一个什么样的概念,在框架中起到什么样的作用?
💖赞助
🧩插件
🔥PPT
  • 项目介绍
  • 项目成员
  • 更新记录
  • 参与开发
👥加入群聊
🧤谁在使用
  • Gitee (opens new window)
  • GitCode (opens new window)
  • Github (opens new window)

广告采用随机轮播方式显示 ❤️成为赞助商
💒首页
  • v2.13.2(当前版本)
  • What's New

    • 🌈What' s New In LiteFlow v2.13.2?
  • 历史版本

    • v2.12.X
    • v2.11.X
    • v2.10.X
    • v2.9.X
    • v2.8.X
  • 升级指南

    • 🌈2.13.0升级指南
    • 2.12.4升级指南
    • 2.12.0升级指南
    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
👑LF CLUB社区
  • 常见问题
  • 专题解释

    • 如何理解上下文这个概念?
    • Slot是一个什么样的概念,在框架中起到什么样的作用?
💖赞助
🧩插件
🔥PPT
  • 项目介绍
  • 项目成员
  • 更新记录
  • 参与开发
👥加入群聊
🧤谁在使用
  • Gitee (opens new window)
  • GitCode (opens new window)
  • Github (opens new window)
  • 🍤LiteFlow简介
  • 🍓项目特性
  • 🧁环境支持

  • 🍟快速开始(Hello world)

  • 🍢配置项

  • 🔗组件

  • 🧩EL规则

  • 🌮上下文

    • 🍄说明
    • 🌯数据上下文的定义和使用
    • 🪶用初始化好的上下文传入
    • 🥨给上下文设置别名
    • 🥙上下文参数注入
    • 🪴用表达式获取上下文参数
  • 🛩执行器

  • 🍋脚本组件

  • 🗂规则配置源

  • 🍼元数据管理

  • 🌌异步中的线程池

  • 🎲动态构造

  • 🧮决策路由

  • 😸生命周期

  • 🎨高级特性

  • ⛱测试用例以及示例

  • 🪂性能表现
  • v2.13.X文档
  • 🌮上下文
铂赛东
2024-05-30

🥙上下文参数注入

版本支持:v2.12.1+

提示

请注意,这个特性只适用于声明式组件。普通的继承式组件并不支持!

以下所有例子采用方法级别式声明。类级别式声明也是可以用此特性的。

我们在组件里面写业务,首先肯定就是要拿到上下文,在声明式组件里通常的写法为:

@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS,nodeType = NodeTypeEnum.COMMON, nodeId = "b")
public void processB(NodeComponent bindCmp) {
    YourContext context = bindCmp.getContextBean(YourContext.class);
    //从context中取到业务数据进行处理
    User user = context.getUser();
    ...
}

如果组件一多,那免不了每次都要写这么一句拿context,虽然不影响什么性能,但是非常繁琐。

LiteFlow从2.12.1开始推出了上下文参数注入特性,可以在方法参数中注入你所需的上下文数据,从而直接拿到,无需再每次取一次了。

假设你的上下文如下:

public class TestContext {

    private User user;

    private String data1;
    
    //getter setter 省略   
}

你在声明式组件中使用@LiteflowFact来定义你的注入型参数:

@LiteflowComponent
public class CmpConfig {

    @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeType = NodeTypeEnum.COMMON, nodeId = "a")
    public void processA(NodeComponent bindCmp,
                        @LiteflowFact("user") User user) {
        user.setName("jack");
    }
}

使用参数注入特性,可以把上下文中已有的值注入到方法参数上,上面这个例子你就可以直接获得上下文中user这个对象。

你可能会有疑惑,如果我这里有多个上下文,我并未指定上下文呀,到底是获取哪个上下文中的user这个对象呢?

LiteFlow会根据你获得的类型去你的上下文中智能的进行搜索匹配,也就是说,你无需关心上下文了。你只需关心组件需要的数据即可。

如果对象比较深,你还可以通过点操作符的方式:

@LiteflowComponent
public class CmpConfig {

    @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeType = NodeTypeEnum.COMMON, nodeId = "a")
    public void processA(NodeComponent bindCmp,
                        @LiteflowFact("user.company.address") String address) {
        //do biz
    }
}

以上这个例子表示address参数取自于上下文中的User对象中的Company对象中的address字段。

当然你也可以注入多个:

@LiteflowComponent
public class CmpConfig {

    @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeType = NodeTypeEnum.COMMON, nodeId = "a")
    public void processA(NodeComponent bindCmp,
                        @LiteflowFact("user.name") String name,
                        @LiteflowFact("data1") String data1) {
        //do biz
    }
}

你在@LiteflowFact中写的表达式,会自动的从上下文中搜索相应的参数。即使你有多个上下文,也无需去指定上下文。

但是有一种情况,在使用时要注意:假设你有两个上下文,TestContext1和TestContext2,在这两个上下文里都有user这个对象,并且两个user里的信息是不一样的。这时你通过@LiteflowFact("user") User user这样去拿,拿到的是第一个user,在不同环境上可能还不一样。

所以使用上下文参数注入特性时,如果有多个上下文,请确保注入的对象,在多个上下文中只有一份,否则会有错乱情况。

当然在有多个上下文拥有同样的属性的时候,你也可以指定上下文,例如这样:

@LiteflowComponent
public class CmpConfig {

    @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeType = NodeTypeEnum.COMMON, nodeId = "a")
    public void processA(NodeComponent bindCmp,
                        @LiteflowFact("orderContext.id") Integer orderId
                        @LiteflowFact("memberContext.id") Integer memberId) {
        //do biz
    }
}

所以当多个上下文拥有相同的属性id时,这里不指定上下文的话,那么框架只会默认赋值为搜索到的第一个名为id的参数。

帮助我们改善此文档 (opens new window)
上次更新: 2025/03/31, 01:02:30
🥨给上下文设置别名
🪴用表达式获取上下文参数

← 🥨给上下文设置别名 🪴用表达式获取上下文参数→

Theme by Vdoing | Copyright © 2020-2025 铂赛东 | MIT License
沪ICP备18012955号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式