CDI @在字段上产生注释的目的是什么?

问题描述 投票:-1回答:2

我想我了解CDI @Produces与工厂方法结合的目的:

@Produces
public TimeLogger getTimeLogger() {
    return new TimeLogger(new SimpleDateFormat("HH:mm"), Calendar.getInstance());
}

但是我并没有真正看到以下内容如何等效:

@Produces
TimeLogger timeLogger;

由于在第二种情况下timeLogger为空,那么它有什么作用?如何指向可以提供TimeLogger实例的工厂?我需要添加限定词吗?

java dependency-injection cdi java-ee-6
2个回答
0
投票

[确定,让我们再试一次。

假设我在托管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;

-1
投票

目的是将CDI的依赖注入与其他依赖注入机制(例如Java EE的@Resource注入)联系起来。

© www.soinside.com 2019 - 2024. All rights reserved.