接口说明
DGC 提供以下三个注解头:
- @Model
- @Compute
- @Observable
@Model
如果一个类需要使用 DGC 功能,则需要在类头上添加 @Model
注解。只有加了 @Model 注解的类,DGC 在实例化对象时才会动态代理。
@Observable
@Observable
作用于 @Model
标识的类中的属性上。
如果一个属性被 @Observable
注解标识,需要为该属性提供相应的 get/set 方法。
同时 DGC 会对该属性进行监听:
- 当调用该属性的 get 方法时,会根据调用关系构建依赖关系图。
- 当调用该属性的 set 方法时,会根据 DGC 中维护的依赖关系图,将所有涉及到的方法的缓存置为失效(删除)。
@Observable(implClass = CopyOnWriteArrayList.class)
private List<String> list;
@Compute
@Compute
作用于 @Model
标识的类中的方法上。
被 @Compute
标识的方法,在每次计算之后会对结果进行缓存。如果在下次访问该方法之前,方法中计算逻辑所涉及到的属性值没有发生变化,则下次访问该方法时会直接返回缓存中的结果,不会再次计算一遍。
注意: @Compute
注解所标识的方法中只能存在 get 逻辑,不允许出现 set 逻辑。
DgcObjectManager
DgcObjectManger是 DGC 的核心入口类,用户在使用 DGC 时应首先实例化DgcObjectManager。
DgcObjectManager dgcObjectManager = new DgcObjectManager()
一个 DgcObjectManager 对象即可管理 DGC 对象依赖图,当然如果为了追求并发,也可以创建多个 DgcObjectManager(比如 Phoenix 集成 DGC 时,每个聚合根对象拥有一个 DgcObjectManger 对象)。
有了 DgcObjectManager 之后对象之后,可以使用 DgcObjectManager 创建被 @Model
注解标识的类的对象,这样该对象的操作就会被 DGC 所代理。
public <T> T getDgcObject(Class<T> targetCls);
public <T> T getDgcObject(Class<T> targetCls, Object... arguments)
DgcManager 有一个全局的功能开关,决定是否启用 DGC 功能,默认为 true(开启)。结合 Phoenix 来用时,可以通过在 phoenix-server 的配置中添加如下配置进行启用/停用:
quantex.phoenix.server.dgc-enable: true
如果是单独使用 DGC 模块的功能,可以通过如下方式选择开启/关闭 DGC 功能。
DgcObjectManager dgcObjectManager = new DgcObjectManager()
dgcObjectManager.setEnable(true/false);