如何创建可扩展的Java应用程序
開放的擴展使許多應用程序受益。 這篇文章描述了兩種在Java中實現這種可擴展性的方法。
可擴展的應用
可擴展應用程序是可以擴展其功能而不必重新編譯它們 ,有時甚至不必重新啟動它們的應用程序。 只需將jar添加到類路徑中,或通過更復雜的安裝過程來實現。
Eclipse IDE是可擴展應用程序的一個示例。 它允許安裝稱為插件的擴展,以便可以使用新功能。 例如,您可以安裝源代碼管理(SCM)插件以與您喜歡的SCM一起使用。
再舉一個例子,設想一個實現了的XACML規范授權 。 XACML中的“ X”代表“可擴展”,并且規范定義了許多擴展點 ,例如屬性和類別ID,結合了算法,功能和策略信息點。 良好的XACML實現將允許您通過提供實現擴展點的模塊來擴展產品。
服務提供商接口
Oracle用于創建可擴展應用程序的解決方案是服務提供商接口 (SPI)。
在這種方法中,擴展點由接口定義:
package com.company.application;public interface MyService {// ... }您可以使用ServiceLoader類找到此類擴展點的所有擴展:
public class Client {public void useService() {Iterator<MyService> services = ServiceLoader.load(MyService.class).iterator();while (services.hasNext()) {MyService service = services.next();// ... use service ...}}此擴展點的擴展可以是實現該接口的任何類:
package com.company.application.impl;public class MyServiceImpl implements MyService {// ... }實現類必須是公共可用的,并且具有公共的無參數構造函數。 但是,這對于ServiceLoader類來說還遠遠不夠。
您還必須在META-INF/services創建一個以擴展點接口的標準名稱命名的文件。 在我們的示例中,將是:
META-INF/services/com.company.application.Myservice此文件必須是UTF-8編碼的,否則ServiceLoader將無法讀取它。 該文件的每一行都應包含實現擴展點的一個擴展的全限定名稱,例如:
com.company.application.impl.MyServiceImplOSGi服務
僅當擴展點文件位于類路徑上時,上述SPI方法才有效。
在OSGi環境中,情況并非如此。 幸運的是,OSGi對于擴展性問題有自己的解決方案: OSGi服務 。
借助Declarative Services ,OSGi服務易于實現,尤其是在使用Apache Felix 服務組件運行時 (SCR)的注釋 時 :
@Service @Component public class MyServiceImpl implements MyService {// ... }使用OSGi和SCR,使用服務也非常容易:
@Component public class Client {@Referenceprivate MyService myService;protected void bindMyService(MyService bound) {myService = bound;}protected void unbindMyService(MyService bound) {if (myService == bound) {myService = null;}}public void useService() {// ... use myService ...}}兩全其美
那么,您應該選擇兩個選項中的哪個? 當然,這取決于您的情況。 在OSGi環境中,顯然應該選擇OSGi服務。 如果您不在OSGi環境中,則無法使用它們,因此只剩下SPI。
但是,如果您正在編寫框架或庫,卻又不知道您的代碼是否將在基于OSGi或類路徑的環境中使用,該怎么辦?
您將希望盡可能多地使用您的庫,因此最好是同時支持這兩種模型。 如果您要小心,可以這樣做。
請注意,將像OSGI-INF/myServiceComponent.xml這樣的Declarative Services服務組件文件添加到jar中(這是SCR注釋在處理時最終會完成的工作)僅在OSGi環境中有效,但在OSGi外部無害。
同樣,SPI服務文件將在傳統的類路徑環境中工作,但在OSGi中是無害的。
因此,這兩種方法實際上是互斥的,并且在任何給定的環境中,這兩種方法中只有一種會找到任何東西。 因此,您可以編寫使用這兩種方法的代碼。 這有點重復,但是它允許您的代碼在兩種類型的環境中都能工作,因此您也可以吃蛋糕。
參考: 如何從安全軟件開發博客上的JCG合作伙伴 Remon Sinnema 創建可擴展Java應用程序 。
翻譯自: https://www.javacodegeeks.com/2012/12/how-to-create-extensible-java-applications.html
總結
以上是生活随笔為你收集整理的如何创建可扩展的Java应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果怎么改时间系统时间
- 下一篇: 凌晨三四点梦见蛇 凌晨三四点梦见蛇的征兆