我一直在阅读的API文档Instance<T>
和Provider<T>
,但是当他们应该使用它并不完全清楚。
以下方法之间有什么区别?
@Inject
MyBean bean;
@Inject
Instance<MyBean> bean;
@Inject
Provider<MyBean> bean;
Provider<T>
是由CDI接口扩展的JSR-330接口Instance<T>
。
注入时MyBean
,如果没有匹配的bean或一个以上的匹配bean,应用程序将在启动期间引发异常。
注入Instance<MyBean>
,Bean解析委托给应用程序:您可以遍历所有候选Bean和select()
想要或调用的候选Bean,并在isUnsatisfied()
没有匹配的Bean时决定要做什么。
对于具有@Dependent
作用域的bean
,调用Instance.get()
将为每次调用创建一个新实例,并且Instance.destroy(t)
在不再需要它时应为每个此类实例调用。
Provider
仅有get()
方法,但没有destroy()
或select()
并且不支持迭代。在CDI环境中,对于所解决的任何用例Provider<T>
,最好使用Instance<T>
。
在CDI中,我能够将bean注入特定的作用域,即定义bean类的作用域。但是,如果我在没有任何作用域的情况下创建bean类,并在注入点为该bean提供作用域,该怎么办呢。我的要求是在后一种情况下使注射时间范围确定成为可能。问题是注入是在而不是所需的带注释的作用域中发生的,除非我使用。 例如: 案例1: 当我在类声明中声明bean的作用域时,如下所示: 像这样注射: 它按预期工作。在应用程序范围中注
问题内容: 在CDI中,您可以使用以下方法定义一个对象,该对象将为您提供某种类型的物品: 同样,在Guice中,您可以执行以下操作: 我想知道Spring中是否有类似的构造,或者您必须使用来获取参考? 问题答案: 因此,经过大量挖掘,我发现Spring支持JSR-330。这个JSR定义了一个简单的API(整个规范实际上就是这个API),它标准化了几个依赖项注入接口,注释和行为。 与Spring不同
我正在使用JUnit4和mockito创建单元测试。我在尝试为一个类成员提供模拟实例时遇到了一个问题。 这是要测试的类: 当我尝试使用时,测试会产生一个。现在我尝试在测试类中注入缺失值: 我试图重新运行测试,但NPE仍然存在。 如何正确地做到这一点?
问题内容: 我有一个包含20个左右注释实现的接口。如果知道在编译时需要的内容,则可以注入正确的内容,但是现在我需要根据运行时参数动态注入内容。 据我了解的文档,我将不得不使用20次左右的注射,然后再使用所需的注射,这对我来说似乎太过分了。有没有一种方法可以绑定特定的实现,然后仅将其注入我的类中? 问题答案: 注入一个[MapBinder](https://google.github.io/guic
问题内容: 当前,我正在使用PersistenceContext注入EntityManager。EM被完美注入。 现在,我尝试装饰Bean,然后突然没有注入em。我得到一个NullPointerException。 我知道EJB和CDI是2个完全不同的管理器,所以一个都不知道另一个。我期望@PersistenceContext是EJB注入点,而@Inject是CDI。我应该怎么做才能解决这个问题并
我有一个web服务,它接收对象,通过AMQP发送通知,并向请求者返回JSON响应。每个请求都是在一个线程上执行的,我正在尝试实现publisher confirms,我正在努力解决如何设置它。我有它的工作,但我不喜欢我这样做。 我这样做的方式是: 在邮件上添加一些标题 拥有一个包含2个订阅者的发布-订阅频道 订户1)创建一个阻塞队列,使其准备就绪,并通过amqp发送消息 订户2)开始在该队列上拉动