簡體   English   中英

Guice:為共享庫創建注入器

[英]Guice: Creating Injectors for Shared Libs

Google Guice新手。 我想用它來處理我正在開發的三個組件的所有IoC和AOP方法攔截:

  • WidgetClient - 一個Swing應用程序
  • WidgetServer - 客戶端將連接到/與之通信的小型EAR
  • WidgetShared - 一個“commons”JAR,包含客戶端和服務器使用的公共類

使用Swing應用程序,我會在某個地方進行顯式調用,如下所示:

public static void main(String[] args) {
    initGuiceInjectors();
}

private static initGuiceInjectors() {
    Guice.createInjector(mySwingAppModule);
}

mySwingAppModule將定義Swing應用程序依賴項的所有綁定。 我將在服務器EAR中做一些非常相似的事情。

當談到WidgetShared庫時,我很窒息,因為lib沒有一個入口點:它只是客戶端和服務器將在整個地方使用的一堆包,類,接口和枚舉。

所以我的第一個問題是: 我在哪里為WidgetShared JAR調用Guice.createInjector()

這個問題強調了第二個(類似的)問題,這就是為什么我選擇在這里進行分組的原因。

我閱讀了Guice的“最佳實踐”,並且壓倒性的共識似乎是(在適用的情況下),將Module實現保持在包級別。 因此,對於每個包,將有一個Module具體定義該包中所有類型的綁定。 這是對單個整體Module的改進,它定義了整個應用程序的綁定。

所以,上面的代碼片段( Guice.createInjector(mySwingAppModule) )實際上不是我的代碼最終會是什么樣的(對不起,我撒了!)。

我的第二個問題是: 創建多個注射器的“最佳實踐”什么?

我看到createInjector(Module... modules)可以使用vararg Module參數。 所以,對我而言,似乎我想擁抱這個“ 每個模塊1個模塊 ”的最佳實踐,在某些時候我必須擁有如下所示的代碼:

Guice.creatorInjector(package1Module, package2Module, package3Module,
    package4Module, package5Module, package6Module, ..., packageNModule);

或者,像這樣:

Guice.createInjector(package1Module);
Guice.createInjector(package2Module);
Guice.createInjector(package3Module);

...

Guice.createInjector(packageNModule);

這兩個看起來都很討厭! 有沒有更好的方法來實現這一目標?!?

提前致謝!

亞當,

你的問題有兩個要素,但顯然都是相關的。 我會倒退,先從第二個元素開始。

每個包的一個模塊的組織很重要,因為它提供了一個可預測的約束應該放置的約定,作為獎勵,它允許您相應地打包保護您的類。 還有一種流行的概念,即創建復合模塊,主要用於安裝每個包模塊的集合,以便充當需要安裝的單個模塊,以便為庫的給定配置添加綁定。 安裝此單個模塊成為庫與使用它的服務器/應用程序之間的主要集成點。

回到第一點,不建議每個應用程序有多個噴射器。 更好的是讓一個注入器安裝它所需的模塊以滿足應用程序中使用的所有綁定。

最后,你會有類似的東西:

public WidgetSharedLibraryModule extends AbstractModule {
  @Override protected void configure() {
    install(new WidgetSublibraryModule1());
    install(new WidgetSublibraryModule2());
    ...
  }
}

你的主要方法如下:

public static void main(String[] args) {
    Injector injector = Guice.createInjector(
        new WidgetSharedLibrary(),
        new WidgetSwingAppModule());
    WidgetSwingApp app = injector.getInstance(WidgetSwingApp.class);
    app.run();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM