§撰寫 Play 模組
注意:此頁面涵蓋新的 模組系統,以新增功能至 Play。
已棄用的
play.Plugin
系統已從 2.5.x 中移除。
模組可以使用任何依賴注入架構撰寫。然而,當您想要擴充 Play 時,您需要避免依賴於特定架構,以便您的擴充可以獨立於依賴注入運作。Play 之前使用 play.Plugin
系統來執行此目的,但在 2.5.x 中,外掛已由 Play 模組取代。
Play 模組是一個擴充 play.inject.Module
的類別,且可以註冊至 Play,而不用明確依賴於特定依賴注入架構。這允許所有人使用 Play 模組。
Play 模組清單可在 模組目錄 中取得。
此外,由於 Play 使用 Play 模組作為內建功能,因此必須使用 Play 模組來取代或擴充內建功能。
§建立和遷移 Play 模組
建立 Play 模組很簡單
public class MyApi {}
public class MyModule extends play.inject.Module {
public List<Binding<?>> bindings(Environment environment, Config config) {
return Collections.singletonList(bindClass(MyApi.class).toSelf());
}
}
如需詳細資訊,請參閱 外掛至模組 的「建立模組類別」區段。
§模組註冊
預設情況下,Play 會載入在根目錄套件(「app」目錄)中定義的任何名為 Module
的類別,或者
您可以在 reference.conf
或 application.conf
中明確定義它們
play.modules.enabled += "modules.MyModule"
§應用程式生命週期
模組可以透過將 play.inject.ApplicationLifecycle
介面注入單例實例,並加入關閉掛勾,來偵測 Play 關閉時發生了什麼事。
請參閱 `ApplicationLifecycle` 範例 和 ApplicationLifecycle 參考 以取得更多詳細資訊。
§測試 Play 模組
Play 模組可以使用 Play 內建的測試功能來測試,方法是使用 GuiceApplicationBuilder
並將繫結新增到模組。
Application application = new GuiceApplicationBuilder().bindings(new MyModule()).build();
請參閱 使用 Guice 進行測試 以取得更多詳細資訊。
§列出現有的 Play 模組
Modules.locate(env, conf)
方法會顯示應用程式中所有可用 Play 模組的清單。沒有對應的 Java 類別。
§覆寫內建模組
在某些情況下,Play 會提供必須覆寫的內建模組。
例如,WSClient 功能是由 WSClient 介面 實作,並由 AhcWSClientProvider 提供支援。如果你撰寫一個延伸 `WSClient` 的替代類別 `MyWSClient`,你可以使用下列方式繫結它
public class MyWSModule extends play.inject.Module {
public List<Binding<?>> bindings(Environment environment, Config config) {
return Collections.singletonList(
bindClass(WSClient.class).toProvider(MyWSClientProvider.class));
}
}
§測試覆寫
測試應用程式時,應使用 `overrides` 方法來取代現有實作
Application application = new GuiceApplicationBuilder().overrides(new MyWSModule()).build();
§註冊覆寫
由於 `AhcWSModule` 會在 `reference.conf` 中自動載入,因此你必須先 停用預設模組,才能新增替代模組
play.modules.disabled += "play.libs.ws.ahc.AhcWSModule"
play.modules.enabled += "modules.MyWSModule"
在發布 Play 模組時,你不應該在 `reference.conf` 中停用現有模組,因為這可能會造成無法預期的後果。請參閱 遷移頁面 以取得詳細資訊。
下一頁:從外掛程式 API 遷移
在此文件發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件指南 後,請隨時提交拉取請求。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開討論。