【发布时间】:2009-07-01 14:31:49
【问题描述】:
我正在尝试使用 Spring AOP 将行为注入对象。目标对象有一个方法,它是这个新行为的连接点。该方法还有一个自定义注释,我希望能够从其他不相关的代码中读取它。因为我的类没有实现接口,所以 Spring 使用 CGLIB 动态子类化目标对象。生成的子类似乎没有将注释添加到原始类中。
我尝试将@Inherited 注释添加到自定义注释中,但没有成功。事实证明@Inherited 仅适用于类。这表明 Spring 必须将我的注释显式应用到子类中的重写方法。
编辑:我找到了解决方法以及有关该问题的更多信息。看起来 CGLib 的人已经意识到了这个问题。注释被视为 Java 中的实现(而不是方法签名的一部分)。重写方法必须重新声明注释。 CGLib 不这样做(故意根据事物的声音)。
我的解决方法是更改我的反射逻辑。在我搜索传递给我的类的注释方法的地方,我现在查看该类,它是超类。我最终使用超类(在代理的情况下)定位该方法,但是当我调用该方法时,应用了常规多态。这会产生一些难看的反射代码(甚至比正常情况更难看)。似乎我不应该在我的代码中补偿 SpringAOP 实现细节。
似乎 Spring 应该提供一种更简洁的方式来处理这个问题。如果有人有其他建议,我们将不胜感激。
【问题讨论】:
-
我建议在 Spring 论坛上问这个问题,在那里你可能会得到一个很好的答案。