我正在学习Java EE CDI,依赖项注入,尤其是@Produces
。我想知道为什么在getGreedingCard()
方法中它根本需要一个@Produces
注释,因为两个类GreetingCardImpl
和AnotherGreetingCardImpl
已经被导入到空间中。就像常规的包/类依赖项一样,简单的导入即可解决问题。为什么需要通过@producer
批注进行依赖项注入?
感谢您事先的解释。
public interface GreetingCard {
void sayHello();
}
public class GreetingCardImpl implements GreetingCard {
public void sayHello() {
System.out.println("Hello!!!");
}
}
public class AnotherGreetingCardImpl implements GreetingCard {
public void sayHello() {
System.out.println("Have a nice day!!!");
}
}
import com.javacodegeeks.snippets.enterprise.cdibeans.impl.AnotherGreetingCardImpl;
import com.javacodegeeks.snippets.enterprise.cdibeans.impl.GreetingCardImpl;
@SessionScoped
public class GreetingCardFactory implements Serializable {
private GreetingType greetingType;
@Produces
public GreetingCard getGreetingCard() {
switch (greetingType) {
case HELLO:
return new GreetingCardImpl();
case ANOTHER_HI:
return new AnotherGreetingCardImpl();
default:
return new GreetingCardImpl();
}
}
}
最佳答案
我想知道为什么在getGreedingCard()方法中,它需要一个@Produces
根本没有注解,因为这两个类GreetingCardImpl和
AnotherGreetingCardImpl已经导入到空间中。
好吧,并不是说getGreetingCard需要@Produces注释。关键是使其他类能够通过依赖注入来接收GreetingCard。
public class Foo {
@Inject // <--- will invoke @Producer method
GreetingCard foosGreetingCard
...
}
有关更多详细信息,请参见here:
生产者方法是充当Bean实例源的方法。
方法声明本身描述了bean和容器
没有实例时,调用该方法以获取Bean的实例
存在于指定的上下文中。