MicronautのシンプルなDI機能を使ってコードの再利用性と保守性を高めてみます。

はじめに

Javaには、SpringやGuiceのような強力なIoC(Inversion of Control)コンテナがたくさんありますが、Micronautもその一つです。IoCコンテナはアプリケーションの構造を整理し、クラス間の依存関係を効率的に管理する手助けをしてくれます。この記事では、ディープラーニングやクラウドネイティブアプリケーションなどトレンドとなっている分野での開発に欠かせない、javaでDIにアノテーションを使わないIoCコンテナを用いたシンプルな例を紹介します。

準備

今回は、軽量フレームワークmicronautを使うので、ここの説明にあるライブラリのインストールが必要になります。

参考: https://micronaut-projects.github.io/micronaut-starter/latest/guide/

プログラムの解説

このプログラムは、MicronautのIoCコンテナを使用して、HelloServiceというインターフェイスとその実装であるJapaneseHelloServiceを登録し、コンテナから取得して利用するシンプルな例です。

  • SimpeleDiCommandクラス:
    • @Commandアノテーションは、このクラスがコマンドラインアプリケーションであることを示します。ただし、今回はアノテーションを使わない方法に焦点を当てるため、この部分は無視してください。
    • mainメソッドでは、PicocliRunnerを使ってクラスを実行します。これはMicronautのCLIフレームワークです。
    • runメソッドでは、BeanContextを起動し、HelloServiceとしてJapaneseHelloServiceをシングルトンとして登録します。次に、callServiceFromContainerメソッドを呼び出します。
package example.micronaut;

import io.micronaut.configuration.picocli.PicocliRunner;
import io.micronaut.context.BeanContext;
import picocli.CommandLine.Command;

@Command(name = "simpele-di", description = "...",
        mixinStandardHelpOptions = true)
public class SimpeleDiCommand implements Runnable {

    BeanContext beanContext;

    public static void main(String[] args) throws Exception {
        PicocliRunner.run(SimpeleDiCommand.class, args);
    }

    public void run() {
        beanContext = BeanContext.run();
        beanContext.registerSingleton(HelloService.class, new JapaneseHelloService());
        callServiceFromContainer();
    }

    void callServiceFromContainer() {
        HelloService helloService = beanContext.getBean(HelloService.class);
        System.out.println(helloService.sayHello("Mike"));
    }
}
  • HelloService インターフェイス:
    • シンプルなインターフェイスで、sayHelloメソッドを定義しています。
package example.micronaut;

public interface HelloService {
    String sayHello(String name);
}
  • JapaneseHelloService クラス:
    • HelloService インターフェイスを実装し、sayHelloメソッドでは挨拶として名前を表示します。
package example.micronaut;

public class JapaneseHelloService implements HelloService {
    @Override
    public String sayHello(String name) {
        return "こんにちは、" + name;
    }
}

アノテーションを使わないIoCコンテナのメリット

アノテーションを使わないIoC(Inversion of Control)コンテナの採用は、複数のメリットを開発者にもたらします。

  1. 設定の柔軟性: アノテーションなしでIoCコンテナを使用することで、設定をプログラムコードから切り離し、外部の設定ファイルで管理することができます。これにより、異なる環境でのデプロイが容易になり、設定の再利用も向上します。
  2. コードの清潔さ: アノテーションは時としてコードを混雑させ、可読性を損なう可能性があります。アノテーションを使わないアプローチでは、コードがすっきりし、目的に集中することができます。
  3. 疎結合: 依存関係をコードから切り離すことで、コンポーネント間の結合が疎になり、テストやメンテナンスが容易になります。これは、アプリケーションのスケーラビリティと保守性にとって重要です。
  4. 移植性: アノテーションに依存しないことで、コードの移植性が向上します。これにより、異なるフレームワークやライブラリとの組み合わせが容易になり、技術選定の自由度が増します。
  5. 学習曲線の緩和: アノテーションには独自の学習曲線があります。特に大規模なフレームワークでは、アノテーションの数が多くなりがちです。アノテーションを使わないIoCコンテナを採用することで、開発者はフレームワークの基本概念に集中でき、学習プロセスがスムーズになります。

これらのメリットを活かして、アノテーションを使わないIoCコンテナは、プロジェクトの効率と品質を向上させる貴重な選択肢となるでしょう。