CDI 规范的第 5.4.1 节规定,如果声明,否则有效的 bean 是不可代理的(因此无法注入)final
。该规范没有给出任何理由,我想不出这个决定的原因。
我试图遵守设计规则,即没有明确设计用于继承的类应该禁止它。因此,CDI 规范似乎强制执行糟糕的设计(并使 CheckStyle 哭泣)。
为什么会这样,可以做些什么呢?
谢谢你。
CDI 规范的第 5.4.1 节规定,如果声明,否则有效的 bean 是不可代理的(因此无法注入)final
。该规范没有给出任何理由,我想不出这个决定的原因。
我试图遵守设计规则,即没有明确设计用于继承的类应该禁止它。因此,CDI 规范似乎强制执行糟糕的设计(并使 CheckStyle 哭泣)。
为什么会这样,可以做些什么呢?
谢谢你。
因为当你为一个类创建代理时,你从它继承(或实现一个接口,如果可能的话)所以如果你的类是最终的,它不能被继承,也不能为它创建代理。
如果你想使用 CDI,你需要有一个 non-final 类。另一种选择是完全不使用 CDI。
在最终类上使用方法拦截技术的唯一方法是更改类本身。这过去是通过称为“增强”的过程来完成的,其中类文件将在磁盘上进行更改;今天我们可以使用一种叫做load-time weaving 的东西。这是一种在加载类时更改类的技术。AspectJ 使用这种技术。