CDI制作人和注射

VWe*_*ber 5 java cdi weld

我想在我的应用程序中使用一个生产者,但我陷入了困境,我正在尝试注入bean.我得到了着名的WELD-001409错误.请减轻我对cdi制作人的理解.

这是我的界面:

@Named
    public interface MessageSender {
      void sendMessage();
    }
Run Code Online (Sandbox Code Playgroud)

豆子:

public class EmailMessageSender implements MessageSender {

  @Override
  public void sendMessage() {
    System.out.println("Sending email message");
  }

}
Run Code Online (Sandbox Code Playgroud)

和制片人:

@SessionScoped
public class MessageSenderFactory implements Serializable {

    private static final long serialVersionUID = 5269302440619391616L;

    @Produces
    public MessageSender getMessageSender() {
        return new EmailMessageSender();
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我正在注入豆子:

@Inject 
MessageSender messageSender;
Run Code Online (Sandbox Code Playgroud)

当我尝试部署项目时,我得到了WELD-001409错误,eclipse也说有多个注入点.

它适用于显式命名:

@Inject @Named("messageSender")
MessageSender messageSender;
Run Code Online (Sandbox Code Playgroud)

这个命名是否必要?

rdc*_*rng 5

  1. 你的EmailMessageSender类实现MessageSender,因此它是一个可用于注入的bean,类型为EmailMessageSenderMessageSender.

  2. 您的生产者返回一个类型的bean MessageSender.

  3. 您的注入点需要整个应用程序中唯一的bean,其类型和限定符与注入点的类型和限定符完全匹配.

从一个和两个你有2个匹配单个注入点的bean - 因此这是一个模糊的依赖.

底线,你的制作人是绝对没有意义在上面的例子中(除了导致错误),因为它简单地返回一个新的实例EmailMessageSender是简单地完全相同的效果@Inject MessageSender,因为EmailMessageSender有默认的范围@Dependent.