我将配置直接反序列化为对象层次结构。某些对象具有构造函数参数,这些参数在配置中未提及,如内部接口。
E.g。配置文件:
<config>
<strategy param="value" class="MyStrategy">
</config>
类:
class Config
{
@ElementList(inline=true,entry="strategy")
List<Object> strategies;
}
class MyStrategy
{
MyStrategy(IFramework framework)
{
}
}
这里我有一个IFramework的实例,并且只要对象在构造函数中需要IFramework参数,就希望SimpleXML使用它。我还没有找到通过配置SimpleXML来完成上述工作的方法。
我现在实施它的方式很难看。我自己从xml节点读取所有元素,创建策略类的实例并在创建的对象上调用Persister.read()。为了使它工作,我必须使用strict = false声明Config类,以跳过由Simple反序列化的策略并添加一个虚拟&#34;类&#34;属于每个策略。
@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告知&#39; autowire&#39; IFramework实例到它创建的对象?
答案 0 :(得分:0)
尝试使用转换器,您只需创建一个并注册它。然后,当您想要加载MyStrategy时,可以调用它。参见