首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

NetBeans Platform 6.8 快速入門:模塊化應用與 Lookup 機制實戰

     編輯:Java 相關知識

NetBeans Platform 基於模塊化架構,提供強大的 Lookup 服務發現機制,實現模塊間鬆耦合通信。本教程通過構建一個包含 4 個模塊的 WordApp 應用,逐步演示:單模塊應用創建、基於接口與 @ServiceProvider 的服務注入、InstanceContent 與 LookupListener 實現跨模塊數據同步,掌握平台核心開發模式。

一、創建基礎平台應用與單模塊

  1. File → New Project → NetBeans Modules → NetBeans Platform Application,項目名 WordApp。
  2. 右鍵 Modules 節點 → Add New Module,名稱 WordEngine,代碼名基 org.demo.wordengine。
  3. 模塊中創建 Window Component,類前綴 Text,包 org.demo.wordengine。
  4. Matisse GUI 設計器拖入 JTextArea(變量名 text)和 JButton(文本 Filter!)。
  5. 按鈕事件處理:
private void jButton1ActionPerformed(ActionEvent evt) {
    String s = text.getText();
    s = s.toUpperCase();
    text.setText(s);
}

運行應用,選單 Window → Text 打開窗口,輸入文本點擊按鈕驗證大寫轉換。

二、引入 Lookup 實現模塊化服務注入

1. 定義服務接口模塊 TextFilter

  • 新建模塊 TextFilter,代碼名基 org.demo.textfilter。
  • 創建接口 org.demo.textfilter.TextFilter:
public interface TextFilter {
    String process(String s);
}
  • 模塊屬性 → API Versioning → 導出包 org.demo.textfilter。
  • 2. 實現服務提供者模塊 MyFilter

    • 新建模塊 MyFilter,代碼名基 org.demo.myfilter。
    • 添加對 TextFilter 模塊的依賴。
    • 實現接口並註冊:
    package org.demo.myfilter;
    import org.demo.textfilter.TextFilter;
    import org.openide.util.lookup.ServiceProvider;
    
    @ServiceProvider(service = TextFilter.class)
    public class UpperCaseFilter implements TextFilter {
        public String process(String s) {
            return s.toUpperCase();
        }
    }

    @ServiceProvider 編譯時自動生成 META-INF/services/org.demo.textfilter.TextFilter 文件,遵循 JDK 6 ServiceLoader 機制,Lookup 可識別並加載。

    3. 消費服務:修改 WordEngine 窗口代碼

    • WordEngine 模塊添加對 TextFilter 模塊依賴。
    • 按鈕事件改為通過 Lookup 查找:
    private void jButton1ActionPerformed(ActionEvent evt) {
        String s = text.getText();
        TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);
        if (filter != null) {
            s = filter.process(s);
        }
        text.setText(s);
    }

    運行驗證功能不變,但實現了解耦:WordEngine 僅依賴接口,不知具體實現,新增過濾器只需添加新模塊並實現接口。

    三、進階:InstanceContent 與 LookupListener 實現數據廣播

    1. TextTopComponent 發布歷史數據

    • 構造函數初始化 InstanceContent 並關聯 Lookup:
    private InstanceContent content;
    public TextTopComponent() {
        initComponents();
        content = new InstanceContent();
        associateLookup(new AbstractLookup(content));
    }
  • 按鈕事件中將原始文本加入 content:
  • content.add(s); // 發布 String 實例到自身 Lookup

    2. History 模塊監聽並顯示歷史

    • 新建模塊 History,代碼名基 com.demo.history,創建 HistoryTopComponent(editor 位置),含 JTextArea historyText。
    • 構造函數監聽全局上下文中的 String 變化:
    private Lookup.Result result;
    public HistoryTopComponent() {
        initComponents();
        result = Utilities.actionsGlobalContext().lookupResult(String.class);
        result.addLookupListener(new LookupListener() {
            public void resultChanged(LookupEvent e) {
                historyText.setText(result.allInstances().toString());
            }
        });
    }

    Utilities.actionsGlobalContext() 返回當前活動窗口的 Lookup 代理,實現跨窗口數據感知。

    四、運行效果與架構總結

    啟動應用:

    • 輸入文本點擊 Filter → 文本轉大寫,同時 History 窗口實時顯示歷史輸入列表。
    • 切換窗口觀察 Lookup.Result 類型改為 Object 時的動態變化。

    核心架構優勢

    機制作用
    模塊依賴 + API 導出強制模塊邊界,僅通過接口通信
    @ServiceProvider + Lookup服務自動發現與注入,消費者零配置
    InstanceContent + LookupListener發布-訂閱模式實現狀態同步,無直接引用

    NetBeans Platform 以此嚴格模塊化與 Lookup 為核心,構建高內聚、低耦合、可動態擴展的富客戶端應用基石。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved