我需要我的应用程序从数据库源读取它的配置,但我必须应用自己的缓存机制来满足更新配置和性能的灵活性(无论何时需要值都不会访问数据库)
执行缓存机制的服务是SymbolSourceImpl
。因为我需要tapestry来缓存可缓存的值,例如JVM选项。我需要提供另一个符号来源。但是SymbolObjectProvider
(由MasterObjectProvider
提供)仅保存SymbolSource
的一个实例,我无法覆盖SymbolSource
默认绑定,因此我考虑将另一个符号对象提供程序提供给{ {1}}正如tapestry使用默认的MasterObjectProvider
。
但是当我尝试提供自己的符号对象提供程序时出现问题:
SymbolObjectProvider
我的 DBSymbolObjectProvider 构造函数如下所示:
@Contribute(MasterObjectProvider.class)
public static void setupDBSYmbolObjectProviders(OrderedConfiguration<ObjectProvider> configuration) {
configuration.addInstance("DBSymbol", **DBSymbolObjectProvider**.class, OrderConstraintBuilder.before("Symbol").build());
}
Tapestry已解决public DBSymbolObjectProvider(IDBSymbolSource symbolSource, @Builtin TypeCoercer typeCoercer) {
this.symbolSource = symbolSource;
this.typeCoercer = typeCoercer;
}
但无法解决TypeCoercer
并抛出以下异常,这是合乎逻辑的,因为IDBSymbolSource
尚未构建以解析MasterObjectProvider
。< / p>
IDBSymbolSource
谢谢。
答案 0 :(得分:1)
即使你让你的自定义SymbolSource
工作,我也不认为你可以有一个可更新的符号(我会回过头来讨论你如何做到这一点)。原因是符号如何插入到服务中。它们被插入到字段中,不会转换为间接存取方法。因此,即使您更改了该值,也不会再次调用您的自定义SymbolSource
来获取该值。
如何撰写自己的SymbolSource
只需装饰SymbolSource服务
public class AppModule {
public SymbolSource decorateSymbolSource(
final SymbolSource symbolSource) {
return new MyCustomSymbolSource(symbolSource);
}
}
使用MasterObjectProvider
时,它不会保留服务,而是作为对象调用。如果您想使用MasterObjectProvider
,仍然总是使用@Local
来帮助解决服务和防止递归的本地服务。