正在载入

等待时间过长时请刷新页面

编写于

最近更新

文件服务概览

LinFile 是配置、语言和数据库服务的统一入口:

ConfigService config = lin.linFile().config();
LangService language = lin.linFile().language();
DataService database = lin.linFile().database();

配置与语言服务使用 Java 对象描述文件结构,数据库服务使用实体类描述表结构。它们共用入口,但不是同一种映射模型。

文件对象

配置对象和语言对象都由公开字段组成。文件中的嵌套结构与 Java 中的嵌套对象对应,例如 database.host:

public class MainConfig {
    public String language = "zh_CN";
    public Database database = new Database();

    public static class Database {
        public String host = "127.0.0.1";
        public int port = 3306;
    }
}

上例是一个合法的 LinFile 文件对象,文件对象需要满足以下条件:

  1. 根类和嵌套类可以被无参构造。
  2. 参与映射的字段为 public 字段。
  3. 字段初始化值只用于声明默认值。
  4. 固定结构使用嵌套类,开放键集合使用 Map<String, ?>。
  5. Map、List 及其元素类型必须能够由 YAML 或 JSON 表达和映射。

构造方法和字段初始化器会在新绑定中执行,因此必须保持无副作用。不要在其中读写文件、连接数据库、注册服务、创建线程或访问尚未初始化的插件状态。

绑定与重载

首次绑定时,服务构造活动对象,保存一份独立的默认值快照,再读取文件并填充同一个对象。默认值快照用于给内存中的缺失键提供回退值,也用于生成差异与执行获准的修复;它不会随着业务代码修改活动对象而改变。

读取类声明 → 构造活动对象 → 保存默认值 → 读取并校验文件 → 提交字段 → 按需写回

同一服务重复绑定同一个类会复用活动根对象。reload() 也会尽量原地刷新它,因此业务代码通常可以继续持有根对象引用。Map、List、数组和配置文本字段可能被替换,重载后应从根对象重新取得这些字段。

关闭或重建 Facade 后,旧服务和对象不再属于新的生命周期,需要重新取得服务并绑定。

写回控制

绑定方法的 emit 参数决定服务能否创建文件、生成差异记录和执行显式保存:

MainConfig config = lin.linFile().config().bind(MainConfig.class, false);
MainLanguage lang = lin.linFile().language().bind(MainLanguage.class, false);

配置和语言对象也可以直接在文件声明注解中禁止写回:

@ConfigFile(name = "config", emit = false)
public final class MainConfig {
}

@LangPack(filePath = "language", emit = false)
public final class MainLanguage {
}

写回控制为 false 时,Linlang 仍会读取并填充对象,但禁止所有写回。类上的 @NoEmit 具有相同作用。bind(..., false)、文件声明中的 emit = false 和 @NoEmit 任一成立时,代码中的显式保存也不能重新启用写回。

请注意,emit 写回控制会阻止任何 Linlang 向文件的写入操作

允许输出不等于允许自动修复。已有文件的缺失键默认只在内存中使用默认值,并生成差异记录;写回原文件需要修复命令、repairMissingKeys() 调用或运行时配置中的持续授权。具体规则见配置文件 ⇱。

Linlang 文件统一使用 UTF-8 编码,请注意 Windows 系统下的兼容性。

讨论

请登录账号