CDI制作人和注射 [英] CDI Producer and Injection

查看:105
本文介绍了CDI制作人和注射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

i want to use a producer in my application but i'm stuck at the point, where i'm trying to inject the bean. im getting the famous WELD-001409 error. please lighten up my understanding of cdi producer.

这是我的界面:

@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也在说有多个注入点。

when i'm trying to deploy the project i get the WELD-001409 error and eclipse also is saying that there are multiple injection points.

它适用于显式命名:

@Inject @Named("messageSender")
MessageSender messageSender;

这个命名是否必要?

推荐答案


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

  1. Your EmailMessageSender class implements MessageSender and therefore it is a bean available for injection with type either EmailMessageSender or MessageSender.

您的生产者返回一个类型为的消息来源

Your producer returns a bean of type MessageSender.

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

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

From one and two you have 2 beans that match a single injection point - therefore that's an ambiguous dependency.

底线,你的生产者在上面的例子中绝对没有意义(除了导致错误)因为它只返回 EmailMessageSender 的新实例,这与<$ c的效果完全相同$ c> @Inject MessageSender ,因为 EmailMessageSender 的默认范围 @Dependent

Bottom line, your producer is absolutely pointless (aside from causing the error) in the above example because it simply returns a new instance of EmailMessageSender which is the same exact effect as simply @Inject MessageSender since EmailMessageSender has the default scope @Dependent.

这篇关于CDI制作人和注射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆