我正在学习Java EE CDI,依赖项注入,尤其是@Produces。我想知道为什么在getGreedingCard()方法中它根本需要一个@Produces注释,因为两个类GreetingCardImplAnotherGreetingCardImpl已经被导入到空间中。就像常规的包/类依赖项一样,简单的导入即可解决问题。为什么需要通过@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的实例
  存在于指定的上下文中。

10-06 08:29