【问题标题】:Why are final classes unproxyable with CDI?为什么 CDI 不能代理 final 类?
【发布时间】:2012-05-23 14:22:28
【问题描述】:

CDI spec 的第 5.4.1 节指出,如果声明为 final,否则有效的 bean 是不可代理的(因此无法注入)。规范没有给出任何理由,我想不出这个决定的原因。

我试图遵守设计规则,即未明确设计用于继承的类应该禁止它。所以 CDI 规范似乎强制执行糟糕的设计(并使 CheckStyle 哭泣)。

为什么会这样,可以做些什么?

谢谢。

【问题讨论】:

    标签: java dependency-injection cdi jboss-weld


    【解决方案1】:

    因为当你为一个类创建代理时,你从它继承(或实现一个接口,如果可能的话),所以如果你的类是最终的,它不能被继承,也不能为它创建代理。

    如果您想使用 CDI,您需要拥有一个非最终类。另一种选择是完全不使用 CDI。

    【讨论】:

    • 感谢您的明确答复,毛里西奥。最后我不情愿地禁用了相应的 checkstyle 模块。放弃 CDI 不是 IMO 的真正选择 :) 用干净的设计与功能交换感觉相当不舒服。
    【解决方案2】:

    在最终类上使用方法拦截技术的唯一方法是更改​​类本身。这过去是通过称为“增强”的过程来完成的,其中类文件将在磁盘上进行更改;今天我们可以使用一种叫做load-time weaving的东西。这是一种在加载类时更改类的技术。 AspectJ 使用了这种技术。

    【讨论】:

    • 谢谢马尔科。所以至少可以做到,尽管下一版 CDI 解决这个问题的可能性很小。
    猜你喜欢
    • 2014-01-08
    • 2016-05-29
    • 1970-01-01
    • 2020-01-27
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多