CDI Продюсер и Инъекция
Я хочу использовать продюсера в своем приложении, но я застрял в точке, где я пытаюсь ввести бин. я получаю знаменитую ошибку 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, и затмение также говорит о наличии нескольких точек ввода.
это работает с явным наименованием:
@Inject @Named("messageSender")
MessageSender messageSender;
это наименование необходимо?
1 ответ
Ваш
EmailMessageSender
реализует классMessageSender
и, следовательно, это боб доступен для инъекций с типом либоEmailMessageSender
или жеMessageSender
,Ваш производитель возвращает боб типа
MessageSender
,Для вашей точки внедрения требуется единственный компонент во всем приложении, тип и квалификаторы которого точно соответствуют типу и квалификаторам точки внедрения.
Из одного и двух у вас есть 2 компонента, которые соответствуют одной точке внедрения - поэтому это неоднозначная зависимость.
Суть в том, что ваш производитель абсолютно бессмыслен (если не вызвать ошибку) в приведенном выше примере, потому что он просто возвращает новый экземпляр EmailMessageSender
что такой же точный эффект, как просто @Inject MessageSender
поскольку EmailMessageSender
имеет область действия по умолчанию @Dependent
,