我有一个自定义XML配置,定义了一种这样的网络
S1 ---- O1 ---- O2 ---- O3 ---- T1
\
+--- O4 ---- O5 ------------ T2
\
S2---+- O6 --+- O7 ------------ T4
/ /
S3-+ /
/
S4 ------+
哪里
S
是某种数据源,如网络套接字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
属性决定应该注入哪种转换器(此处String
到Double
)。
要创建实例,我需要想象出一个依赖图并开始实例化对象而没有我图中的其他对象作为依赖(在这种情况下是源),然后我将创建仅依赖于在第一步等等。
所以我基本上会为我的特殊用例重新发明像Spring这样的东西。有没有办法利用Spring在我的案例中创建和连接对象?一个粗略的黑客攻击是将我的xml配置转换为beans.xml。但也许有更好的方式使用BeanFactory
等。或者可以直接创建Spring元模型吗?
我正在使用Spring 4.3,但如果有帮助的话,可以选择Spring 5的RC。
答案 0 :(得分:2)
此处尚未提及的另一个选择是使用XSLT。
我们的想法是定义xsl
,将您的特定于域的xml
映射到spring beans xml
(XSLT + XPath应该足够覆盖你的情况。)
然后,您可以使用xml
读取特定于域的xsl
,transform,并将结果提供给spring。
答案 1 :(得分:1)
查看StaticApplicationContext。文档中指出它是:
主要用于测试。
...但它是一个完整的应用程序上下文,支持程序化bean注册。
您可以在StaticApplicationContext
内阅读特定于域的xml并根据它定义bean。
This blog post可以让您了解如何使用StaticApplicationContext
来定义带引用和构造函数args的bean。
答案 2 :(得分:1)
从文档中实例化对象的更简单方法是
答案 3 :(得分:1)
&#34; crud&#34; hack方法可能是一种更好的方法,但不是手动将config xml转换为beans xml文件,我建议你看一下Extensible XML authoring方法。
配置解析器,a.k.a。bean定义解析器,允许您构建bean定义,最终将使用您的应用程序的spring上下文来实例化bean。
这也应该消除了手动计算依赖层次结构和自己实例化对象的需求。
希望它能回答你的问题。