【问题标题】:CDI Collect All Annotated MethodsCDI 收集所有带注释的方法
【发布时间】:2020-03-06 00:13:20
【问题描述】:

我知道使用 cdi,您可以收集使用某个注释(通过观察 ProcessAnnotatedType)注释的所有类型(类/接口)。但是,我想收集所有带有某个注释的方法。纯CDI可以做到这一点吗?我有一个使用反射库 (org.reflections) 的示例,但如果可能的话,我想使用 cdi 来执行此操作。有谁知道如何做到这一点? 谢谢, 康纳

【问题讨论】:

  • 我不知道有任何此类机制。使用反射库。

标签: reflection dependency-injection cdi weld


【解决方案1】:

其实观察者方法是这样的:

private final <T> void typeFound(@Observes
                                 @WithAnnotations(MyMethodAnnotation.class)
                                 final ProcessAnnotatedType<T> event) {

}

...针对 CDI 发现的任何类型并在其中任何地方存在@MyMethodAnnotation

“由 CDI 发现”部分意味着所讨论的类型必须首先是可发现的。通常,当您在类型上添加 bean defining annotation 时会发生这种情况。

(我说“通常”是因为a bean discovery mode of annotated is the default 可能是最常见的“在野外”。There are others。)

然后您可以从AnnotatedType 对象可访问get access to all the AnnotatedMethods from the AnnotatedType object 可从ProcessAnnotatedType 事件访问。

【讨论】:

  • 嗨莱尔德,感谢您的洞察力。这是我最初尝试过的(使用所有的 bean 发现模式),但我无法让它工作(与上面实现 Extension 的类中的代码相同)。还有什么我忘记了吗?与此同时,我将继续尝试再次输入代码。谢谢
  • 我什么都想不出来。我通常会尝试使用annotated 并使用 bean-defining annotations,所以对于发现什么和没有发现什么是毫无疑问的。
  • 实际上,我确实忘记了一些可能很明显但可能不是的事情:确保您的 Extension 也注册在 META-INF/services/javax.enterprise.inject.spi.Extension 文件中。
  • 这不起作用,您只会收到有关 CDI 位的通知。当然不是所有的方法。如果您观察所有 PAT(在发现模式 all)然后检查他们的方法,我不确定您会得到什么,但这无论如何都是非常暴力的方式......
  • @Silarius,ProcessAnnotatedType 事件和@WithAnnotations(MyMethodAnnotation.class) 肯定会在其代码中的某处找到所有发现的具有@MyMethodAnnotation 的类型。正如您所说,然后由用户来查找注释出现在该类型中的确切位置。
【解决方案2】:

不,你不能用纯 CDI 做到这一点,你应该使用一些不同的方法。

您尝试执行的操作超出了 CDI 的范围。您最初使用 CDI 扩展的想法是一个很好的想法,但是它不会触发您想要的所有方法。它被定制为挂钩到 CDI 引导过程并改变/丰富它。不要干预部署中的所有类。

您最好使用一些专注于检查部署中所有类的方法。 Jandex comes to my mind,建立索引后搜索速度超快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多