@javaee中的生产者注释
我正在学习JavaEECDI、依赖项注入,尤其是@javaee中的生产者注释,java,jakarta-ee,dependency-injection,cdi,Java,Jakarta Ee,Dependency Injection,Cdi,我正在学习JavaEECDI、依赖项注入,尤其是@products。我想知道为什么在getGreedingCard()方法中,它需要一个@生成的注释,因为两个类GreetingCardImpl和另一个类GreetingCardImpl已经导入到空间中。这就像常规的包/类依赖关系一样,通过简单的导入即可解决问题。为什么它需要通过@producer注释进行依赖项注入 谢谢你提前解释 public interface GreetingCard { void sayHello(); } pu
@products
。我想知道为什么在getGreedingCard()
方法中,它需要一个@生成的注释,因为两个类GreetingCardImpl
和另一个类GreetingCardImpl
已经导入到空间中。这就像常规的包/类依赖关系一样,通过简单的导入即可解决问题。为什么它需要通过@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()方法中,它需要一个@products
注释,因为两个类分别是GreetingCardImpl和
空间中已经导入了另一个GreetingCardImpl
当然,getGreetingCard并不需要@Products注释。关键是让其他类能够通过依赖项注入接收问候卡
public class Foo {
@Inject // <--- will invoke @Producer method
GreetingCard foosGreetingCard
...
}
公共类Foo{
@Inject/在您的情况下,它不需要@products
,因为您将注入工厂bean并直接使用其方法来创建实例,而不是自己注入问候卡bean
@Inject
GreetingCardFactory factory;
...
GreetingCard card = factory.getGreetingCard();
如果您将其定义为@products
方法,并尝试注入问候卡
,那么您将得到我在注释中描述的异常
但是,如果您要另外创建限定符,如下所示:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
public @interface ProducedCard {}
@Inject @ProducedCard
GreetingCard card;
并将其添加到生产者方法中:
@Produces @ProducedCard
public GreetingCard getGreetingCard() {
...
然后,您就可以使用producer方法注入GreetingCard
bean,如下所示:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
public @interface ProducedCard {}
@Inject @ProducedCard
GreetingCard card;
因为现在已经没有歧义了,因为只有一个地方可以创建标有@ProducedCard
:-)的贺卡,在你给Jan的链接中,“我们不能编写一个本身就是随机数的bean类。但我们当然可以编写一个返回随机数的方法。”.为什么我们不能编写一个本身就是随机数的类?任何类都可以用bean的形式编写。对吗?这是一个不相关的问题-在SOF中,通常不使用注释,而是开始一个新的问题。否则它就变得很难阅读和理解。你测试过了吗?因为你应该有模糊性SolutionException作为欢迎卡可以在3个位置创建(2个类和producer方法)。有关产品的相关问题,请参阅此链接