是否能夠真正做面向介面的開發,和系統所採用的容器或架構具有很大的關係,面向介面的開發最重要的就是解決系統的依賴問題,在這點上目前最成熟的解決方案莫過於IoC,IoC容器而言最成功的莫過於Spring,那麼基於OSGI的話是不是會帶來不同的視角呢,來看看這幾個方面的例子:
1、A類希望能夠執行系統中實現了B介面的類
在OSGI中實現這種是多麼的簡單,可以看看:
ServiceReference[] serviceRefs=context.getServiceReference(B.class.getName());
for(int i=0;i<serviceRefs.length;i++){
B b=(B)context.getService(serviceRefs[i]);
b.execute();
}
用習慣了IoC的人都會去說上面的方法還需要通過context主動擷取這麼的爛,那麼在OSGI中你同樣可以用下面的這樣一種方式去調用:
public void setService(B b){
b.execute();
}
這樣的方式滿意了吧,在這樣的情況只需要將這個類對於B的引用配置為cardinality="0..n",那麼OSGI架構就會自動的去完成調用實現了B介面的類的execute方法。
ps: 可以想象基於這樣的方式要實現COR Pattern是多麼的容易....
2、A類引用了Log介面,但無所謂系統中有否Log介面的實現此類都需要正常運行
在OSGI中要做到這個同樣是非常的容易:
public void setLog(Log log){
this.log=log;
}
只需要將這個類對於Log的引用配置為:cardinality="0..1"
3、A類希望根據某種條件來決定到底調用哪個實現介面的類
在OSGI中可以通過象屬性過濾、版本過濾等多種方式來動態決定調用相應的實現介面的類,可以想象有這種來實作類別似的商務邏輯的處理是不是更加的簡單和方便呢。
4、動態性
這個自然是因為OSGI 帶來的特性,在基於OSGI構建的這樣的系統中,我們完全可以先定義好介面,然後啟動整個系統,當完成了某個介面的實現後,部署到OSGI架構中,再使用此介面的功能後自然就可以直接使用了,整個系統完全無需進行重啟等麻煩的操作。
從以上簡單的幾個例子可以看出,基於OSGI做真正的面向介面的開發變得非常的容易和靈活,而動態性特徵更是使得可以完全以介面的方式先搭建好系統,這對於迭代式的開發模型來說非常的重要。
為什麼說這樣的方式才是真正的面向介面的開發呢,可以看到在傳統的開發方式中,無論怎麼樣,都仍然是要先有實現了介面的類後系統才可運行,而在基於OSGI的開發中完全不需要,在基於OSGI的系統中開發人員可以確定當需要的介面的實現都提供了後,功能自然就是實現了的,而無需管系統中是否具體有介面的實現,更為重要的一點是由於傳統的開發方式多是在運行前定義好依賴關係,而在基於OSGI的系統很容易實現運行期才決定依賴關係,這對於提升系統的靈活性的效果不言而喻。
ps:我知道很多spring高手在看了上面的例子後會告訴我基於spring也可以去實現上面的這些例子,但是不是要做出更多的增強呢,spring本身並沒有classloader的完整機制,所以要基於它去實現這些動態特徵的時候會變得很複雜,而既然現在OSGI已經提供了這些,為什麼一定要基於spring去增強來達到這些已經在OSGI中達到的目標呢?