2012-10-21 66 views
0

我有一個Swing項目使用Spring爲DI,現在我正試圖遷移到Eclipse 4OSGi
使用Spring的配置文件,用戶可以註釋/取消註釋bean以添加/刪除功能(由這些後端bean提供)。
現在EclipseOSGi我正在尋找最好的方法來做到這一點根據OSGi
我知道我可以使豆類服務和OSGi定義啓動級別,但是這並沒有解決我的使用情況下,它是:
應用程序啓動沒有這些豆子/模塊的運行,如果用戶更新配置從正在運行的UI中,這些beans/modules啓動,並且它們也在應用程序的下一次啓動時啓動。
對我的問題有一個很好的/乾淨的方法嗎?如何以良好的方式從Spring DI遷移到OSGi DI?

回答

0

就像你已經發現了服務是一個很好的方法來解決這個問題。只需安裝所有模塊,但不要啓動它們。然後,當用戶選擇他想要的功能時,您的用戶界面可以啓動和停止模塊。然後,OSGi框架會在重新啓動時記住已安裝和已啓動的模塊。

2

您可能想要使用Eclipse Gemini Blueprint來管理Spring和OSGi之間如何整合所有東西(雙子座藍圖是Spring Dynamic Modules的後繼者)。特別是,它可以爲您處理與動態服務註冊相關的所有複雜問題;你的豆可以保持幾乎相同。

1

另一種方法是使用Declarative Services和Configuration Admin一起使配置數據確定要激活哪些服務。 In more detail here

0

絕對最佳方法是聲明式服務(DS)。 DS與OSGi的配置管理集成在一起,使得控制服務實例的數量以及它們的配置和服務屬性變得微不足道。例如,下述成分(與BND註釋[不久將類似於在OSGi規範類似的功能):

@Component(designateFactory=Config.class) 
    public MyComp implements MyService { 
     interface Config { 
     int port(); 
     String host(); 
     } 
     Config config; 
     @Activate 
     void activate(Map<String,Object> map) { 
     config = Configurable.createConfigurable(Config.class,map); 
     start(); 
     } 

     void foo() { ... do the MyService stuff ... } 

     @Reference 
     void setDataSource(DataSource ds) { ... } 
    } 

該組件要求一個配置管理工廠配置。瞭解這種功能的最佳方式是使用Apache Felix Webconsole設置框架。 designateFactory=Config.class告訴bnd在該包中創建一個元類型 XML文件。 Webconsole使用它來爲配置數據創建一個非常漂亮的外觀,從接口及其方法派生。這種形式是類型識別的,即不能輸入端口號的非數值。通過webconsole,您現在可以通過創建多個工廠配置來實例化多個組件。刪除這些工廠配置,刪除服務。在您的應用程序中,您可以在用戶的​​控制下自行操作Configuration Admin。

另一個優點是,通過Configuration Admin,您可以控制組件依賴關係的綁定。在上述示例中,您可以將dataSource.target屬性設置爲像(db=accounting)這樣的過濾器來選擇記帳數據庫。所有配置屬性都作爲服務屬性添加,因此您可以在創建數據源的配置(如果以此方式實現)上輕鬆設置'db'服務屬性。

這是DS最不理解的優點之一,我可以告訴你這是巨大的。要開始這個,只需在bndtools中創建一個DS項目,然後新建一個Run Descriptor並選擇Webconsole模板。

DS的另一個優點是它很小,並且不會試圖隱藏動態,這在Blueprint中可能會很痛苦。