我想我了解CDI @Produces与工厂方法结合的目的:
@Produces
public TimeLogger getTimeLogger() {
return new TimeLogger(new SimpleDateFormat("HH:mm"), Calendar.getInstance());
}
但是我并没有真正看到以下内容如何等效:
@Produces
TimeLogger timeLogger;
由于在第二种情况下timeLogger
为空,那么它有什么作用?如何指向可以提供TimeLogger实例的工厂?我需要添加限定词吗?
[确定,让我们再试一次。
假设我在托管bean中有一个字段。用Foo
键入:
private Foo foo;
假设我使用普通的Java东西在某个地方的方法中设置了该字段:
// Let's pretend this is called from our constructor.
private void initialize() {
this.foo = goGetAFooFromLDAPOrSomething();
// yay, now foo is set to something that I went and got from somewhere;
// I just went out and got it; I didn't do anything fancy involving
// CDI
}
[现在假设在我的应用程序中的其他地方,我想使用Foo
,但是我真的不想再次经历这种头痛,只是想表明Foo
是我的要求之一,所以,作为一名良好的CDI公民,我只想@Inject
一个Foo
:
// In some other class somewhere.
// Hey, CDI, get me a Foo that was produced elsewhere,
// however you do it.
@Inject
private Foo injectedFoo;
如果我们就在这里停下来,将无法满足这个注入点。目前尚无人以CDI知道的方式“制作” Foo
。
我可以通过简单地将@Produces
添加到托管bean的foo
字段来满足注入点:
@Produces
private Foo foo;
毕竟,我们自己手动填充了该字段,然后向CDI表示,当有人要求将Foo
注入某个地方时,只需返回该字段的值,它就可以“生成” Foo
。
这有意义吗?
在这种情况下,限定符与其他限定符没有什么不同:它们是指示制造或注入哪种类型的Foo
的另一种方式。如果我想注入@Yellow
Foo
,那么我将这样表示:
@Inject @Yellow private Foo injectedFoo;
...然后我必须确保某处某处产生
@Yellow
Foo
。在这个愚蠢的例子中,可以这样设置:
@Produces
@Yellow
private Foo foo;
目的是将CDI的依赖注入与其他依赖注入机制(例如Java EE的@Resource
注入)联系起来。