CDI制作人和注射
我想在我的应用程序中使用一个生产者,但我陷入了困境,我正在尝试注入bean。 我得到了着名的WELD-001409错误。 请减轻我对cdi制作人的理解。
这是我的界面:
@Named public interface MessageSender { void sendMessage(); }
豆子:
public class EmailMessageSender implements MessageSender { @Override public void sendMessage() { System.out.println("Sending email message"); } }
和制片人:
@SessionScoped public class MessageSenderFactory implements Serializable { private static final long serialVersionUID = 5269302440619391616L; @Produces public MessageSender getMessageSender() { return new EmailMessageSender(); } }
现在我正在注入豆子:
@Inject MessageSender messageSender;
当我试图部署项目时,我得到了WELD-001409错误,eclipse也说有多个注入点。
它适用于显式命名:
@Inject @Named("messageSender") MessageSender messageSender;
这个命名是否必要?
-
您的
EmailMessageSender
类实现了MessageSender
,因此它是一个可用于注入的bean,其类型为EmailMessageSender
或MessageSender
。 -
您的生产者返回
MessageSender
类型的bean。 -
您的注入点需要整个应用程序中唯一的bean,其类型和限定符与注入点的类型和限定符完全匹配 。
从一个和两个你有两个匹配单个注入点的bean – 因此这是一个模糊的依赖。
最重要的是,您的生产者在上面的示例中绝对没有意义(除了导致错误),因为它只返回一个新的EmailMessageSender
实例,这与@Inject MessageSender
效果完全相同,因为EmailMessageSender
具有默认范围@Dependent
。