プロデューサメソッド
コンポーネントライフサイクルの説明を行ったとき、ライフサイクルの最初に行われるのはコンポーネントの生成である、ということをお伝えした。生成時には、通常コンテナによって自動的にコンポーネントのコンストラクタが呼び出される。
コンポーネントの生成には、ほかにもプロデューサメソッドを使用する方法がある。プロデューサメソッドとは、コンポーネントに属するメソッドのうち、@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();
}
}