🧅类级别式声明
类级别式声明主要用处就是通过注解形式让普通的java bean变成LiteFlow的组件。无需通过继承类或者实现接口的方式。
由于LiteFlow的组件常规方式下需要继承类来定义,使得你无法再继承自己业务的类了。这个特性可以解决这个问题。但是和常规组件一样,需要一个类对应一个组件。
# 普通组件的声明
你可以如下去进行一个普通组件的声明:
@LiteflowComponent("a")
@LiteflowCmpDefine
public class ACmp{
@LiteflowMethod(LiteFlowMethodEnum.PROCESS)
public void processAcmp(NodeComponent bindCmp) {
System.out.println("ACmp executed!");
}
@LiteflowMethod(LiteFlowMethodEnum.IS_ACCESS)
public boolean isAcmpAccess(NodeComponent bindCmp){
return true;
}
@LiteflowMethod(LiteFlowMethodEnum.BEFORE_PROCESS)
public void beforeAcmp(NodeComponent bindCmp){
System.out.println("before A");
}
@LiteflowMethod(LiteFlowMethodEnum.AFTER_PROCESS)
public void afterAcmp(NodeComponent bindCmp){
System.out.println("after A");
}
@LiteflowMethod(LiteFlowMethodEnum.ON_SUCCESS)
public void onAcmpSuccess(NodeComponent bindCmp){
System.out.println("Acmp success");
}
@LiteflowMethod(LiteFlowMethodEnum.ON_ERROR)
public void onAcmpError(NodeComponent bindCmp, Exception e){
System.out.println("Acmp error");
}
@LiteflowMethod(LiteFlowMethodEnum.IS_END)
public boolean isAcmpEnd(NodeComponent bindCmp) {
return false;
}
@LiteflowMethod(value = LiteFlowMethodEnum.ROLLBACK)
public void rollbackA(NodeComponent bindCmp) throws Exception {
System.out.println("ACmp rollback!");
}
}
使用者无需继承NodeComponent
了,在你定义的类上,只要类上加上LiteflowCmpDefine
注解,相应的方法上加上LiteflowMethod
注解,即可完成对任意自定义类的组件化工作。
其中LiteFlowMethod
的作用是把你自己的定义的方法映射成组件的方法。除了有示例上的值外,还有其他的映射方法。具体可以看下普通组件章节。
注意点1
关于参数的参数,这里需要注意的是,方法上参数必须传入NodeComponent bindCmp
这个参数,而且必须是第一个参数。
比如原先的process()
,那么在声明式里就是yourMethodName(NodeComponent bindCmp)
。
如果是原先的onError(Exception e)
,那么在声明式里就是yourMethodName(NodeComponent bindCmp, Exception e)
。
规律很明显,就是原先的参数保留,在第一个位置插入NodeComponent
对象,代替原先的this
。
以前获取上下文Bean是用this
关键字,现在只需从bindCmp中获取就可以了。
方法的名称可以定义成你想要的任何方式。这个并无限制。
注意点2
自己定义方法时,返回值要和常规组件里的对应方法返回值一致。比如普通组件的process
方法是不返回的,比如IF组件的processIf
方法是返回布尔值的。
如果写错,也会发生一点异常,可能会增加你的排查时间。
# 选择组件的声明
声明选择组件在类和方法上都需要加上NodeTypeEnum.SWITCH
参数。
@Component("e")
@LiteflowCmpDefine(NodeTypeEnum.SWITCH)
public class ECmp{
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH, nodeType = NodeTypeEnum.SWITCH)
public String processSwitch(NodeComponent bindCmp) throws Exception {
System.out.println("Ecomp executed!");
return "g";
}
}
# 条件组件的声明
声明选择组件在类和方法上都需要加上NodeTypeEnum.IF
参数。
@Component("x")
@LiteflowCmpDefine(NodeTypeEnum.IF)
public class XCmp{
@LiteflowMethod(value = LiteFlowMethodEnum.IF, nodeType = NodeTypeEnum.IF)
public boolean processIf(NodeComponent bindCmp) throws Exception {
//do your biz
return true;
}
}
# 数值循环组件的声明
声明选择组件在类和方法上都需要加上NodeTypeEnum.FOR
参数。
@Component("x")
@LiteflowCmpDefine(NodeTypeEnum.FOR)
public class XCmp{
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_FOR, nodeType = NodeTypeEnum.FOR)
public int processFor(NodeComponent bindCmp) throws Exception {
//do your biz
return 10;
}
}
# 条件循环组件的声明
声明选择组件在类和方法上都需要加上NodeTypeEnum.WHILE
参数。
@Component("x")
@LiteflowCmpDefine(NodeTypeEnum.WHILE)
public class XCmp{
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeType = NodeTypeEnum.WHILE)
public boolean processWhile(NodeComponent bindCmp) throws Exception {
//get your while flag
boolean flag = xxxxxx;
return flag;
}
}
# 退出循环组件的声明
声明选择组件在类和方法上都需要加上NodeTypeEnum.BREAK
参数。
@Component("x")
@LiteflowCmpDefine(NodeTypeEnum.BREAK)
public class XCmp{
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BREAK, nodeType = NodeTypeEnum.BREAK)
public boolean processBreak(NodeComponent bindCmp) throws Exception {
//get your break flag
boolean flag = xxxxxx;
return flag;
}
}
# 注意点
提示
对于类里的其他方法,也都和processXxx
一样的方式去声明。