问题
在 Bean 发现期间或之后,我如何确定 Bean 源自哪个 Bean 归档,而不依赖于实现细节(如果可能)?
详细说明
在 Jakarta CDI 和 Java EE CDI 规范中引用了“Bean Archives”。据我所知,Bean 存档是任何包含 beans.xml(显式 bean 存档)或具有已使用 bean 定义注释进行注释的类的 Java 存档。
据我所知,CDI 规范(Jakarta 和 Java EE)都没有添加 bean 归档的概念作为其 API 定义的一部分。
一些 CDI 实现(例如 Weld)具有用于 bean 存档概念的类/接口(例如 BeanArchives、BeanDeploymentArchive),但我不想依赖实现细节。
至于任何可能的答案。我对可能的实现没有任何限制,因为我完全控制 CDI 容器。 无论它采取扩展、拦截器还是装饰器的形式,我真的不介意。
您可以通过以下方式获取档案的工作列表:
someClassLoader.getResources("/META-INF/beans.xml");
…然后确保这些文件实际上是有效的
beans.xml
文件(或者您可以决定信任环境)。
您可以通过以下方式获得大多数课程(但不是全部)的有效位置:
someClass.getProtectionDomain().getCodeSource().getURL();
(这是简短的版本,实际上,您必须处理潜在的
null
,但您明白了。)
从这两个食谱中,也许您可以接近您想要的任何东西。请注意,每种方法都可能失败,但对于涉及使用普通类加载器运行的非模块化 Java 应用程序中的 jar 文件的“正常”情况,您可能可以主要依赖于此。