2017-08-31 64 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和將結果提供給春天。