🥙上下文参数注入
版本支持: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
这个对象。
如果对象比较深,你还可以通过点操作符的方式:
@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,在不同环境上可能还不一样。
所以使用上下文参数注入特性时,如果有多个上下文,请确保注入的对象,在多个上下文中只有一份,否则会有错乱情况。
帮助我们改善此文档 (opens new window)
上次更新: 2024/05/31, 00:13:04