Skip to content

Spring Boot 集成

FSScript 提供了完整的 Spring Boot 自动配置支持。

自动配置

引入依赖后,以下 Bean 会自动注册:

Bean 名称类型说明
fsscriptExpFactoryDefaultExpFactory表达式工厂
fsscriptEngineFactoryFsscriptEngineFactory脚本引擎工厂
fsscriptEngineScriptEngineJSR-223 脚本引擎
fileFsscriptLoaderFileFsscriptLoader文件加载器

注入使用

java
@Service
public class MyService {

    @Resource
    private ScriptEngine fsscriptEngine;

    public Object execute(String script) {
        return fsscriptEngine.eval(script);
    }
}

访问 Spring Bean

在脚本中通过 @beanName 语法访问 Spring Bean:

javascript
// 导入 Bean
import userService from '@userService';

// 调用 Bean 方法
export var user = userService.getUserById(1001);

预设变量

java
@Service
public class ReportService {

    @Resource
    private ScriptEngine fsscriptEngine;

    public Object generateReport(Map<String, Object> params) {
        // 预设变量
        fsscriptEngine.put("params", params);
        fsscriptEngine.put("currentUser", getCurrentUser());

        // 执行脚本
        return fsscriptEngine.eval("""
            export let report = {
                title: params.title,
                generatedBy: currentUser.name,
                data: @reportDataService.getData(params.dateRange)
            };
        """);
    }
}

预编译脚本

对于需要重复执行的脚本,使用预编译可以提升性能:

java
@Service
public class RuleEngine {

    @Resource
    private ScriptEngine fsscriptEngine;

    private CompiledScript compiledRule;

    @PostConstruct
    public void init() throws ScriptException {
        Compilable compilable = (Compilable) fsscriptEngine;
        compiledRule = compilable.compile("""
            export let result = amount > threshold ? 'high' : 'low';
        """);
    }

    public String evaluate(BigDecimal amount, BigDecimal threshold) {
        Bindings bindings = fsscriptEngine.createBindings();
        bindings.put("amount", amount);
        bindings.put("threshold", threshold);

        compiledRule.eval(bindings);
        return (String) bindings.get("result");
    }
}