1概要

以前のリンク:/ratpack[article]で、Ratpackを使ったスケーラブルなアプリケーションの構築がどのようになるかを示しました。

このチュートリアルでは、依存管理エンジンとしてhttps://ratpack.io/[ラットパック]を使用して

Google Guice

を使用する方法についてさらに説明します。

** 2なぜGoogle Guiceなのか

**



Google Guice


は、

Google



Apache License

の下でリリースした

Java

プラットフォーム用のオープンソースソフトウェアフレームワークです。

設定が簡単な非常に軽量な依存関係管理モジュールです。さらに、それは使いやすさのためにコンストラクタレベルの依存性注入のみを許可します。


Guice

に関する詳細は

こちら

をご覧ください。

** 3 RatpackでGuiceを使う

**


3.1. Mavenの依存関係

Ratpackは

Guice

依存関係を第一級でサポートしています。したがって、

Guiceに外部の依存関係を手動で追加する必要はありません;

Ratpack

がすでに組み込まれています。

Ratpack

sの

Guice__サポートの詳細はhttps://ratpack.io/manual/current/guice.html[ここ]を参照してください。

したがって、

pom.xml

に次のコア

Ratpack

依存関係を追加するだけです。

<dependency>
    <groupId>io.ratpack</groupId>
    <artifactId>ratpack-core</artifactId>
    <version>1.4.5</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.ratpack%22%20AND%20a%3A%22ratpack-core%22[Maven]で確認できます。

Central

** 3.2. ビルディングサービスモジュール

**


Maven

設定が完了したら、ここではサービスを構築し、単純な依存性注入をうまく利用します。

サービスインターフェイスとサービスクラスを1つずつ作成しましょう。

public interface DataPumpService {
    String generate();
}

これはインジェクタとして機能するサービスインタフェースです。それでは、それを実装し、サービスメソッド__generate()を定義するサービスクラスを構築する必要があります。

public class DataPumpServiceImpl implements DataPumpService {

    @Override
    public String generate() {
        return UUID.randomUUID().toString();
    }

}

ここで注意すべき重要な点は、私たちは

RatpackのGuice

モジュールを使っているので、手動でサービスクラスをインジェクトするのに

Guice

s

@ ImplementedBy



@ Inject

アノテーションを使う必要はないということです。

** 3.3. 依存関係管理

**


Google Guice

を使用して依存関係管理を実行する方法は2つあります。

1つ目は

Guice

のhttps://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/AbstractModule.html[

AbstractModule

]を使用するなどGuiceのhttps://github.com/google/guice/wiki/InstanceBindings[instance binding]メカニズムメソッドを使用します。

public class DependencyModule extends AbstractModule {

    @Override
    public void configure() {
        bind(DataPumpService.class).to(DataPumpServiceImpl.class)
          .in(Scopes.SINGLETON);
    }

}

ここで注意すべき点がいくつかあります。


  • AbstractModule

    を拡張することで、デフォルトの__configure()をオーバーライドしています。

方法
**

DataPumpServiceImpl

クラスと

DataPumpService

をマッピングしています。

以前に構築されたサービス層であるインタフェース
** また、依存関係を

Singleton

マナーとして注入しました。

** 3.4. 既存のアプリケーションとの統合

**

依存関係管理設定は準備ができたので、統合しましょう

public class Application {

    public static void main(String[]args) throws Exception {

      RatpackServer
          .start(server -> server.registry(Guice
            .registry(bindings -> bindings.module(DependencyModule.class)))
            .handlers(chain -> chain.get("randomString", ctx -> {
                DataPumpService dataPumpService = ctx.get(DataPumpService.class);
                ctx.render(dataPumpService.generate().length());
            })));
    }
}

ここでは、

registry()

を使用して、

AbstractModule

を拡張する

DependencyModule

クラスをバインドしました。

RatpackのGuice

モジュールは内部で必要なものの残りを行い、サービスを

Context

アプリケーションにインジェクトします。

これは

application-contextで利用可能なので、

アプリケーション内のどこからでもサービスインスタンスを取得できます。ここでは、現在のコンテキストから

DataPumpService

インスタンスを取得し、サービスの

generate()

メソッドを使用して

/randomString

URLをマッピングしました。

  • その結果、

    /randomString

    URLがヒットすると、ランダムな文字列フラグメントが返されます。

** 3.5. 実行時インスタンスバインディング

**

前述したように、今度はGuiceのインスタンスバインディングメカニズムを使用して、実行時に依存関係管理を行います。依存関係を注入するために

AbstractModule

の代わりにGuiceの

bindInstance()

メソッドを使用することを除けば、以前の手法とほぼ同じです。

public class Application {

    public static void main(String[]args) throws Exception {

      RatpackServer.start(server -> server
        .registry(Guice.registry(bindings -> bindings
        .bindInstance(DataPumpService.class, new DataPumpServiceImpl())))
        .handlers(chain -> chain.get("randomString", ctx -> {
            DataPumpService dataPumpService = ctx.get(DataPumpService.class);
            ctx.render(dataPumpService.generate());
        })));
    }
}

ここでは、

bindInstance()

を使用して、インスタンスバインディングを実行しています。


DataPumpServiceImpl

クラスに

DataPumpService

インターフェースを注入します。

このようにして、前の例で行ったように、サービスインスタンスを

application-context

に注入できます。

依存関係管理には2つの方法のいずれを使用することもできますが、依存関係管理モジュールとアプリケーションコードを完全に分離するため、

AbstractModule

を使用することをお勧めします。

このようにして、コードは将来ずっとずっときれいにそして容易に維持されるでしょう。

** 3.6. ファクトリ製本

依存関係管理のためのもう1つの方法、

factory binding

もあります。これは

Guiceの実装に直接関連しているわけではありませんが、これは

Guice__と並行して機能することもできます。

ファクトリクラスはクライアントを実装から切り離します。単純なファクトリは、静的メソッドを使用してインタフェースのモック実装を取得および設定します。

ファクトリバインディングを有効にするために既に作成されたサービスクラスを使用することができます。


DependencyModule



GuiceのAbstractModule

クラスを拡張する)と同じようにファクトリクラスを1つ作成し、静的メソッドを介してインスタンスをバインドするだけです。

public class ServiceFactory {

    private static DataPumpService instance;

    public static void setInstance(DataPumpService dataPumpService) {
        instance = dataPumpService;
    }

    public static DataPumpService getInstance() {
        if (instance == null) {
            return new DataPumpServiceImpl();
        }
        return instance;
    }
}

  • ここでは、サービスクラスをファクトリクラスに静的にインジェクトしています** 。したがって、一度にそのインタフェースの1つのインスタンスだけがこのファクトリクラスに利用可能になるでしょう。その後、サービスインスタンスを設定および取得するための通常の

    getter/setter

    メソッドを作成しました。

ここで注意しなければならないのは、

getter

メソッドでは、サービスの単一のインスタンスのみが存在するかどうかを確認するために明示的なチェックを1回行ったことです。 nullの場合は、実装サービスクラスのインスタンスを作成し、それを返すだけです。

その後、このファクトリインスタンスをアプリケーションチェーンで使用できます。

.get("factory", ctx -> ctx.render(ServiceFactory.getInstance().generate()))


4テスト中


Ratpack

sの内部JUnitテストフレームワークの助けを借りて、私たちのアプリケーションをテストするために

Ratpack

s

https://ratpack.io/manual/current/api/ratpack/test/MainClassApplicationUnderTest

]を使います。必要な依存関係を追加する必要があります(https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.ratpack%22%20AND%20a%3A%22ratpack-test%22[ratpackそれのために-test])。

ここで注意しなければならないのは、URLの内容は動的であるため、テストケースを書いている間はそれを予測できないということです。したがって、テストケースでは

/randomString

URLエンドポイントのコンテンツ長を一致させることになります。

@RunWith(JUnit4.class)
public class ApplicationTest {

    MainClassApplicationUnderTest appUnderTest
      = new MainClassApplicationUnderTest(Application.class);

    @Test
    public void givenStaticUrl__getDynamicText() {
        assertEquals(21, appUnderTest.getHttpClient()
          .getText("/randomString").length());
    }

    @After
    public void shutdown() {
        appUnderTest.close();
    }
}


5結論

この簡単な記事では、

Google Guice



Ratpack

の併用方法について説明しました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/ratpack[over on GitHub]から入手可能です。