プロデューサメソッド

コンポーネントライフサイクルの説明を行ったとき、ライフサイクルの最初に行われるのはコンポーネントの生成である、ということをお伝えした。生成時には、通常コンテナによって自動的にコンポーネントのコンストラクタが呼び出される。

コンポーネントの生成には、ほかにもプロデューサメソッドを使用する方法がある。プロデューサメソッドとは、コンポーネントに属するメソッドのうち、@Producesを付与した物のことを指す。たとえばリスト21のようなコードだ。

リスト21

    @Component
    public class GreetingFactory {
      @Produces
      public GoodMorning getGoodMorning() {
        // ロケールに応じて異なるインスタンスを返す
        if (Locale.getDefault().equals(Locale.JAPAN)) {
          return new JapaneseGoodMorning();
        } else {
          return new GoodMorning();
        }
      }
    }

このように、カスタマイズされた初期化を行う場合などにプロデューサメソッドは便利だ。また、生成されるコンポーネントインスタンスのバインディングタイプは、メソッドが属するコンポーネントの物を引き継ぐか、あるいはメソッドごと指定することもできる。

リスト22

    @Component
    public class GreetingFactory {

      @Produces
      public GoodMorning getGoodMorning() {
        return new GoodMorning();
      }
      @Produces @Japanese
      public GoodMorning getJapaneseGoodMorning() {
        return new JapaneseGoodMorning();
      }
    }