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 文件对象,文件对象需要满足以下条件:
public 字段。Map<String, ?>。构造方法和字段初始化器会在新绑定中执行,因此必须保持无副作用。不要在其中读写文件、连接数据库、注册服务、创建线程或访问尚未初始化的插件状态。
首次绑定时,服务构造活动对象,保存一份独立的默认值快照,再读取文件并填充同一个对象。默认值快照用于给内存中的缺失键提供回退值,也用于生成差异与执行获准的修复;它不会随着业务代码修改活动对象而改变。
读取类声明 → 构造活动对象 → 保存默认值 → 读取并校验文件 → 提交字段 → 按需写回
同一服务重复绑定同一个类会复用活动根对象。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 系统下的兼容性。
讨论