根据您的问题的意思,以下是 Guice(Java 的 DI 框架)使用的内容:
如果您只是在每次有注入请求时都想要一个不同的对象Foo
,那么在连接您的应用程序时,不要绑定Foo.class
到 的特定实例Foo
,而是绑定 a Provider<Foo>
,这是一个Foo
按需创建的对象。然后,每一个Foo
被注入的地方都会得到一个新的实例。如果您只是绑定Foo
到一个类而不是Foo
实例(例如,Foo
是一个接口,并且您将它绑定到RealFoo.class
一个实现的类Foo
),您也会得到相同的效果 - 每次都会创建一个新实例。(这是默认的“无作用域”行为。Guice 作用域的行为超出了本评论的范围)
但是,如果您需要Foo
在连接应用程序时构建两个实例,然后能够说“这个 Foo 的实例在制作 aBar
或 a时使用Baz
,而另一个实例在制作 a 时使用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
你可以跳过其中的bind
一行。
我知道有基于反射的 php 注释处理框架,或者您可以使用基于参数名称的约定。