流程驱动器（FlowDriver）的相关接口，主要有三个：



| 接口 | 描述 |
| ----------------- | -------- | 
| FlowDriver                 | 流程驱动接口定义     | 
| AbstractFlowDriver     | 虚拟流程驱动器，实现基本能力，并抽象出：脚本运行接口（Evaluation）和组件容器接口（Container）。一般做为基类使用     | 
| SimpleFlowDriver     | 简单流程驱动器。以 AbstractFlowDriver 为基础，提供 Evaluation 和 Container 组搭支持。    | 


### 1、SimpleFlowDriver 的默认状态

当使用默认构造时，默认会使用 LiquorEvaluation 脚本执行器和 SolonContainer 组件容器。

```java
SimpleFlowDriver flowDriver = new SimpleFlowDriver();
```

流程引擎，默认的驱动器就是这个状态。

### 2、SimpleFlowDriver 的简单组搭

可选的组搭组件（也可以，自己定制）



| 组件 | 类型 | 描述 |
| -------- | -------- | -------- |
|                            | 组件容器    |  用于管理任务组件     |
| MapContainer       | 组件容器     | 基于 Map 实现的组件容器（适合无容器环境）     |
| SolonContainer     | 组件容器     | 对接 solon 的组件容器     |
|       |       |       |
|                              | 脚本执行器    |  用于支持条件与任务脚本     |
| LiquorEvaluation     | 脚本执行器     | 基于 liquor 实现，支持完整 java 语法。（权限很大，要做好安全控制）     |
| AviatorEvaluation     | 脚本执行器     | 基于 aviator 实现，支持完整 aviator 语法     |
| BeetlEvaluation     | 脚本执行器     | 基于 beetl 实现，支持完整 beetl 语法     |
| MagicEvaluation     | 脚本执行器     | 基于 magic 实现，支持完整 magic 语法     |

* AviatorEvaluation，需要引入包：`org.noear:solon-flow-eval-aviator`
* BeetlEvaluation，需要引入包：`org.noear:solon-flow-eval-beetl`
* MagicEvaluation，需要引入包：`org.noear:solon-flow-eval-magic`


简单组搭示例：


```java
//构建组件容器
MapContainer container = new MapContainer();
container.putComponent("DemoCom", (ctx, node)->{
    System.out.println(node.getId());
});

//构建驱动
SimpleFlowDriver flowDriver = new SimpleFlowDriver(container);

//构建引擎
FlowEngine engine = FlowEngine.newInstance(flowDriver);

//----- 

//动态构建图，并执行
Graph graph = Graph.create("c1", decl -> {
    decl.addActivity("n1").task("@DemoCom");
});

engine.eval(graph, "n1", FlowContext.of());
```


### 3、驱动器定制参考

驱动器的定制，可以基于 AbstractFlowDriver 或 SimpleFlowDriver 进行重写与扩展（比较重），也可以定制脚本执行器和组件容器进行组搭（比较轻）。

定制脚本执行器参考 AviatorEvaluation：

```java
public class AviatorEvaluation implements Evaluation {
    @Override
    public boolean runTest(FlowContext context, String code) {
        return (Boolean) AviatorEvaluator.execute(code, context.model());
    }

    @Override
    public void runTask(FlowContext context, String code) {
        AviatorEvaluator.execute(code, context.model());
    }
}

//应用
//SimpleFlowDriver flowDriver = new SimpleFlowDriver(new AviatorEvaluation());
```

定制组件容器参考 SpringContainer（比如把它应用到 Spring 环境）：

```java
@Component
public class SpringContainer implements Container, ApplicationContextAware {
    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext context) {
        this.context = context;
    }

        @Override
    public Object getComponent(String componentName) {
        return context.getBean(componentName);
    }
}

//应用
//@Configuration
//public class FlowEngineConfig  {
//    @Bean
//    public FlowEngine flowEngine(SpringContainer container) {
//        FlowEngine flowEngine = FlowEngine.newInstance(new SimpleFlowDriver(container));
//        
//        flowEngine.load("classpath:flow/*.yml")
//        
//        return flowEngine;
//    }
//}
```


