我知道它仍然不太受欢迎,因为该规范几个月前才发布。

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

第三方 jar 中的 Bean 的解析是否通过将它们声明为来实现 <alternatives> 在你的 beans.xml?

如果没有,如何使用没有的第三方库中的bean beans.xml ?

将 jar 放在类路径上将不起作用,除非有 beans.xml 在他们的 META-INF, ,对于第 3 方 jar 来说,这是不可能的。(看 加文·金 (Gavin King) 关于该主题的帖子)

有帮助吗?

解决方案

为什么想得这么复杂?

只需为那些第 3 方类创建一个 ProducerMethod 即可。

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

private @Inject PdfFaxService faxService;

在您的代码中,那么您可以简单地使用生产者方法提供它。PdfFaxService 无状态工作,因此我们可以放心地假设我们可以做到这一点 @ApplicationScoped:

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

某处。

嗯。

其他提示

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

要在给定部署场景中使用替代方案,您可以在 <alternatives> CDI 部署描述符的元素 META-INF/beans.xml. 。这将使 @Alternative 默认情况下禁用的 bean。

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

换句话说, 备择方案 是替换的好方法 现有实施 在部署时与另一个一起使用。如果没有什么可替换的,则不需要替代方案,只需将 jar 放在类路径上即可。虽然不确定这正是你的问题,但我对第 3 方 jar 的概念有疑问。

更多内容请参见 2.1.4.备择方案, 4.6.备择方案4.7.修复不满意和不明确的依赖关系 (但我猜这就是你正在读的内容)。

更新: 回答你的附加问题。

如果没有,如何使用没有 beans.xml 的第三方库中的 beans

这不可能发生,bean 档案必须有一个 bean.xml (可以是空的)详见本节 15.6。打包和部署 文档的:

CDI没有定义任何特殊的部署档案。您可以在罐子,ejb-jars或战争中打包豆类 - 应用程序类路径中的任何部署位置。然而,存档 必须成为“bean 档案”。这意味着每个包含豆的存档必须包括一个名为的文件 beans.xml 在里面 META-INF 类路径的目录或 WEB-INF Web根目录(用于战争档案)。该文件可能为空。部署在没有的档案中的豆类 beans.xml 文件将无法在应用程序中使用。

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

更新2: 看来使用 BeforeBeanDiscovery.addAnnotatedType() 可以添加在 Bean 发现期间要考虑的其他类。(BeforeBeanDiscovery 是一个事件)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top