2009-07-01 58 views
2

我试图使用Spring AOP将行为注入到对象中。目标对象有一个单一的方法,它是这种新行为的连接点。该方法还有一个自定义注释,我希望能够从其他不相关的代码中读取。因为我的类没有实现接口,所以Spring使用CGLIB动态地为目标对象创建子类。生成的子类似乎没有将注释添加到原始类中。SpringAOP生成的动态子类缺少注释

我尝试将@Inherited注释添加到自定义注释中,但没有运气。原来@Inherited只适用于类。这表明Spring将不得不将我的注解明确应用于子类中的重写方法。

编辑:我找到了解决方法和一些问题的更多信息。它看起来像CGLib的人都知道这个问题。注释被视为像Java中的实现(而不是像方法签名的一部分)。重写方法必须重新声明注释。 CGLib不会这样做(故意通过事物的声音)。

我的解决方法是改变我的反射逻辑。在我寻找传递给我的类的注释方法的地方,我现在看看这个类,它是超类。我最终找到使用超类的方法(在代理的情况下),但是当我调用方法时,应用常规多态。这使得一些丑陋的反射代码(比平常更丑陋)。它也似乎不应该补偿我的代码中的SpringAOP实现细节。

看来Spring似乎应该提供一个更清晰的方法来处理这个问题。如果有人有其他建议,他们将不胜感激。

+0

我建议在Spring论坛上提问,你可能会在那里得到一个很好的答案。 – skaffman 2009-07-01 15:18:45

回答

0

你确定你的注解的RetentionPolicy设置为RUNTIME吗?

+0

是的。如果我的Aspect没有应用于类(例如,如果没有CGLib子类),则可以找到注释。 – 2009-07-01 15:50:51