6

我知道它仍然不是很流行,因为该规范是在几个月前发布的。

我还没有“安装”焊接,我只是在阅读,通过这个问题,我想确保我已经正确理解了这一点:

是否通过将 3rd-party jar 中的 bean 声明为<alternatives>您的beans.xml?

如果没有,如何使用 3rd 方库中没有的 bean beans.xml

beans.xml除非在他们的 jar 中,否则将 jar 放在类路径上是行不通的META-INF,对于 3rd 方 jar,您无法做到这一点。(请参阅Gavin King 关于该主题的帖子

4

2 回答 2

6

为什么想得这么复杂?

只需为这些 3rd 方类创建一个 producerMethod。

假设您有一个第三方库,它会自动获取 PDF 文件并按传真发送它们,并且您喜欢使用类似

private @Inject PdfFaxService faxService;

在你的代码中,那么你可以简单地为它提供一个生产者方法。PdfFaxService 是无状态的,所以我们可以放心地假设我们可以做到@ApplicationScoped

public @Produces @ApplicationScoped PdfFaxService createFaxService() {
  return new PdfFaxService(initparameters);
}

某处。

hth。

于 2010-02-26T20:37:37.437 回答
3

我对替代方案的理解是,它是您可以在不同部署环境(例如测试环境)中使用的接口的其他一些实现的替代方案。通过使用 注释来声明替代@Alternativebean 。

要在给定部署方案中使用替代方案,请在<alternatives>CDI 部署描述符的元素中选择它META-INF/beans.xml。这将启用@Alternative默认禁用的 bean。

启用后,如果容器发现给定注入点的不明确依赖项,它将查看可以注入的替代方案,如果确实有一个,则选择该替代方案。

换句话说,替代方案是在部署时用另一个实现替换现有实现的好方法。如果没有什么可替换的,你不需要替代品,只需将你的 jar 放在类路径上。虽然不确定这是否正是您的问题,但我对 3rd-party jars 的概念有疑问。

2.1.4 中的更多内容。替代品4.6。替代品4.7。修复不满意和模棱两可的依赖关系(但我想这就是你正在阅读的内容)。

更新:回答您的其他问题。

如果没有,如何使用没有 beans.xml 的 3rd 方库中的 bean

这不可能发生,bean 存档必须有一个bean.xml(可以是空的),如第15.6 节所述。文档的打包和部署

CDI 没有定义任何特殊的部署存档。您可以将 bean 打包在 JAR、EJB-JAR 或 WAR 中——应用程序类路径中的任何部署位置。但是,存档必须 是“bean 存档”。这意味着每个包含 bean 的存档都必须包含一个在类路径目录或 Web 根目录中命名的文件(对于 WAR 存档)beans.xml。 该文件可能为空。部署在没有文件的档案中的 Bean 将无法在应用程序中使用。META-INFWEB-INFbeans.xml

然后,要修复不满足和不明确的依赖关系,请参阅前面提到的 4.7 节。

更新 2:似乎BeforeBeanDiscovery.addAnnotatedType()可以在 bean 发现期间添加其他要考虑的类。(BeforeBeanDiscovery是一个事件)

于 2010-02-15T10:02:49.303 回答