2017-08-31 70 views
4

我定义一种网络这样创建自定义XML配置对象的网络春

S1 ---- O1 ---- O2 ---- O3 ---- T1 
\ 
    +--- O4 ---- O5 ------------ T2 
    \ 
S2---+- O6 --+- O7 ------------ T4 
    / /
S3-+  /
     /
S4 ------+ 

  • S自定义XML配置是某种形式的数据源,如网络插座
  • O是一个操作符处理所述数据
  • T是所述靶标或数据宿

这些元素表示使用XML块这样的:

<source name="S1" address="ws://example/1" type="websocket" dataType="double" /> 

<operator name="O6" type="threshold"> 
    <input name="S1"/> 
    <input name="S2"/> 
    <input name="S3"/> 
    <property name="threshold" value="10.34" /> 
    <property name="window" value="10.0" /> 
</operator> 

<sink name="T1" type="database"> 
    <input name="O3"/> 
</sink> 

的依赖关系的构造参数。我的例子操作O6将有一个构造是这样的:

class ThresholdOperator extends Operator<Boolean> { 

    public ThresholdOperator(
     String name,    // "O6" 
     List<DataSource> sources, // [S1, S2, S3] 
     double threshold,   // 10.34 
     double window) {   // 10.0 
    ... 

有可能是这个类有不同的构造函数的参数的多个实例。一个类可能有多个构造函数。基类的类型参数是输出类型。

type属性决定了具体的类必须被实例化。源的属性dataType决定应该注入哪种类型的转换器(此处为StringDouble)。

要创建实例我需要绘制出一个依赖关系图并开始实例化没有其他对象从我的图形作为依赖关系(在这种情况下的来源),然后我会创建的对象只依赖于创建的对象第一步等等。

因此,我基本上将为我的特殊用例重新创建类似Spring的东西。有没有办法在我的情况下利用Spring创建和连接对象?有点粗糙的黑客可能会将我的xml配置转换为beans.xml。但也许有更好的方法使用BeanFactory或类似的。或者是否有可能直接创建Spring元模型?

我使用的是Spring 4.3,但是Spring 5的RC可能是一个选项,如果它有帮助的话。

+0

我已经添加了另一种可能的解决方案,可能对您的情况有用。查看我的帖子更新。 –

+0

您可能想看看[tag:apache-camel],因为您似乎为某些端点构建了一些处理路由和指令。 –

回答

1

看一看StaticApplicationContext。它在文档中声明:

主要用于测试。

......但它是一个完整的应用程序上下文,它支持程序化的bean注册。

您可以在StaticApplicationContext的内部阅读您的特定于域的xml并根据它定义bean。

This blog post可以给你一个关于如何使用StaticApplicationContext来定义具有引用和构造函数参数的bean的想法。

+0

谢谢,'StaticApplicationContext'就是我一直在寻找的东西。我建议你分开你的答案('StaticApplicationContext',XSLT)以明确选择的解决方案是什么,并给予其他人分别投票给这两种方法的机会。 – deamon

+0

@deamon好主意,完成。 –

1

更简单的方法来实例化对象从该文件将是要么

  1. 创建一个XML Schema描述您的数据格式,并使用JAXB创建Java类
  2. 注释现有的Java类与JAXB注释
+0

我已经在使用JAXB,但是由此产生的对象结构离我的目标对象太远,由于JAXB的限制,我无法靠近。所以我需要一个额外的组装步骤,但我喜欢你的想法,因为它可能是更简单情况下的解决方案。 – deamon

+1

您是否考虑过使用XSLT或mapstruct将输入转换为您所需要的? – Faron

1

的“污物”黑客的方法可能是一个更好的办法,但不是你的配置XML转换到手动豆xml文件,我建议你看看Extensible XML authoring方法。

配置解析器a.k.a. bean定义解析器允许您构建将最终用于应用程序的spring上下文来实例化bean的bean定义。

这也应该消除手动计算依赖关系层次结构和自己实例化对象的需求。

希望它能回答你的问题。

+0

这是一个非常好的方法。但是,如果我理解正确,那么一个焦点仍然需要普通的Spring XML作为“容器”。所以我无法按原样使用externe XML文件,但可以轻松将其转换为我自定义的Spring XML扩展格式。对? – deamon

1

此处尚未提及的另一种替代方法是使用XSLT

的想法是定义xsl映射域特定xml去春来豆xmlXSLT + XPath应该是绰绰有余,以支付您的情况)。

然后,您可以阅读特定领域的xmltransform它与xsl和将结果提供给春天。