質問の意味に応じて、Guice(Java用のDIフレームワーク)が使用するものは次のとおりです。
のインジェクションリクエストがあるたびに個別のオブジェクトが必要な場合はFoo
、アプリケーションを接続するときFoo.class
に、の特定のインスタンスにバインドせずFoo
、代わりに、オンデマンドProvider<Foo>
を作成するオブジェクトであるをバインドします。次に、注入されFoo
たすべての場所が新しいインスタンスを取得します。インスタンスではなくクラスにFoo
バインドするだけの場合(たとえば、はインターフェイスであり、それを実装するクラスにバインドすると)、同じ効果が得られます。つまり、毎回新しいインスタンスが作成されます。(これはデフォルトの「スコープなし」の動作です。Guiceスコープの動作はこのコメントの範囲を超えています)Foo
Foo
Foo
RealFoo.class
Foo
Foo
ただし、アプリケーションを接続するときに作成する2つのインスタンスが必要な場合は、「このFooのインスタンスは、Bar
またはを作成するときBaz
に使用されますが、この他のインスタンスは、を作成するときに使用されますBumble
」と言うことができます。注入ポイントに注釈を付けてから、アプリを配線するときに次のように言います。
Foo foo1 = new Foo("1");
Foo foo2 = new Foo("2");
bind(Foo.class).annotatedWith(Names.named("Bar")).toInstance(foo1);
bind(Foo.class).annotatedWith(Names.named("Baz")).toInstance(foo1);
bind(Foo.class).annotatedWith(Names.named("Bumble")).toInstance(foo2);
Bar
のコンストラクターへの引数に次のような注釈を付けたと仮定します。
public Bar(@Named("Bar") Foo foo) { ...
そして同様にBaz
とBumble
。もちろん、とのコンストラクターに同じもので注釈を付ける場合はBar
、Baz
1行をスキップできますbind
。
リフレクションに基づくphpのアノテーション処理フレームワークがあることは知っています。あるいは、引数名に基づく規則を使用できるかもしれません。