我将我的配置直接反序列化为对象层次结构。一些对象具有在配置中未提及的构造函数参数,例如内部接口。
例如配置文件:
<config>
<strategy param="value" class="MyStrategy">
</config>
类:
class Config
{
@ElementList(inline=true,entry="strategy")
List<Object> strategies;
}
class MyStrategy
{
MyStrategy(IFramework framework)
{
}
}
在这里,我有一个 IFramework 实例,并且希望 SimpleXML 在对象需要构造函数中的 IFramework 参数时使用它。我还没有找到仅通过配置 SimpleXML 来完成上述工作的方法。
我现在实现它的方式很丑陋。我自己从 xml 节点读取所有元素,创建策略类的实例并在创建的对象上调用 Persister.read()。为了使其工作,我必须使用 strict=false 声明 Config 类,以跳过 Simple 反序列化的策略,并为每个策略添加一个虚拟的“类”属性。
@Root(strict=false)
class Config
{
List<Object> strategies;
void loadStrategies(IFramework framework, Persister persister, InputNode source)
{
// traverse all nodes looking for "strategy"
// create strategy (e.g. MyStrategy)
// call persister.read(strategy, source)
}
}
class MyStrategy
{
@Attribute(name="class")
String dummy;
MyStrategy(IFramework framework)
{
}
}
我想知道这是否可以通过 SimpleXML 中的某种机制来解决。 是否可以告诉 SimpleXML 将 IFramework 实例“自动装配”到它创建的对象?