通过SpEL动态调用方法实现流程引擎是否合适?

有人用SpEL写过流程引擎吗?自己实现了一个:将要用到的对象以及Service类作为variables变量添加到StandardEvaluationContext中,然后动态构建表达式字符串修改对象或者调用Service中的方法来实现流程引擎的功能。但是网络上好像并没有找到这样的实现,于是好奇一问。
基础代码如下:

    private final ExpressionParser parser = new SpelExpressionParser();
    private final StandardEvaluationContext context = new StandardEvaluationContext();
    @Autowired
    MessageService messageService;
    public void init(){
        context.setVariable("currentUser", currentUser);
        context.setVariable("messageService", messageService);
        String action = "#messageService.sendMessage(#currentUser.getId, "hello!")"
        parser.parseExpression(action).getValue(context);
    }

这种用spel直接调用方法的方式是不是不太合适呢?但是功能确确实实是实现的,通过编写流程能实现消息通知、权限验证、以及类似状态机编排等操作。

阅读 770
1 个回答

使用 SpEL (Spring Expression Language) 来构建流程引擎是完全可行的,但是不推荐使用,会有一些潜在问题:

  • 安全性风险 - 如果表达式来源于用户输入或数据库,可能存在执行任意代码的风险
  • 可维护性 - 随着流程变得复杂,字符串表达式可能变得难以维护
  • 调试困难 - 表达式中的错误只能在运行时才能发现
  • 性能 - 动态表达式的解析和执行比直接方法调用有更多开销
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题