@javaee中的生产者注释

@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

我正在学习JavaEECDI、依赖项注入,尤其是
@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方法)。有关产品的相关问题,请参阅此链接