🥙上下文参数注入
版本支持: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的参数。