【问题标题】:Can I use CDI to look for all qualifier-annotated methods in any beans?我可以使用 CDI 在任何 bean 中查找所有带有限定符注释的方法吗?
【发布时间】:2014-10-12 19:39:42
【问题描述】:

我想为我的业务逻辑实现一种模式,类似于处理 WebSocket 注释方法的方式。给定传入消息的特定参数的值,我想在动态查找的托管 bean 中调用一个带注释的方法。例如,给定以下设置:

@Qualifier
@Target( ElementType.METHOD )
@Retention( RetentionPolicy.RUNTIME )
public @interface Handler { }

@ApplicationScoped public class MyHandler1 {

  @Handler public void someMethod() { }

  @Handler public void otherMethod() { }

}

然后我想编写一个函数来根据该参数值选择一个方法。它应该像给定“someMethod”作为值一样简单,并使用名为“someMethod”的方法查找我的合格托管bean并调用它。

我的问题是使用 Instance<...> 选择 bean 仅适用于类型级限定符和/或类型。要真正找到方法,我需要遍历所有方法。我有点担心查找成本和/或必须管理缓存或某种类型的东西。

【问题讨论】:

    标签: java jakarta-ee reflection annotations cdi


    【解决方案1】:

    您不应该使用限定符来标记方法,任何其他注释都可以。

    如果您确实想使用 CDI,则可以编写一个观察 ProcessAnnotatedType 事件的 CDI 扩展。

    话虽如此,从您的问题描述来看,我不确定您到底要做什么,也不知道 CDI 是否是最好的方法。

    【讨论】:

    • 我将把它标记为已回答,因为看起来 ProcessAnnotatedType 可能是实现它的最佳方式。然后对于每种类型,我可以扫描其方法以查找注释,而不必担心代理和合成方法以及其他一切。现在开始阅读 SPI...
    【解决方案2】:

    您可以使用https://code.google.com/p/reflections/ 扫描您的课程。它非常快并且可以很容易地被缓存。您甚至可以使用反射 maven 插件在编译时进行扫描...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2020-11-26
      • 2013-07-24
      • 1970-01-01
      相关资源
      最近更新 更多