焊接中外部(第 3 方)bean 的解析
-
20-09-2019 - |
题
我知道它仍然不太受欢迎,因为该规范几个月前才发布。
我还没有“安装”焊接,我只是在阅读,通过这个问题我想确保我已经正确理解了这一点:
第三方 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
是一个事件)