我试图使用Spring AOP将行为注入到对象中。目标对象有一个单一的方法,它是这种新行为的连接点。该方法还有一个自定义注释,我希望能够从其他不相关的代码中读取。因为我的类没有实现接口,所以Spring使用CGLIB动态地为目标对象创建子类。生成的子类似乎没有将注释添加到原始类中。SpringAOP生成的动态子类缺少注释
我尝试将@Inherited注释添加到自定义注释中,但没有运气。原来@Inherited只适用于类。这表明Spring将不得不将我的注解明确应用于子类中的重写方法。
编辑:我找到了解决方法和一些问题的更多信息。它看起来像CGLib的人都知道这个问题。注释被视为像Java中的实现(而不是像方法签名的一部分)。重写方法必须重新声明注释。 CGLib不会这样做(故意通过事物的声音)。
我的解决方法是改变我的反射逻辑。在我寻找传递给我的类的注释方法的地方,我现在看看这个类,它是超类。我最终找到使用超类的方法(在代理的情况下),但是当我调用方法时,应用常规多态。这使得一些丑陋的反射代码(比平常更丑陋)。它也似乎不应该补偿我的代码中的SpringAOP实现细节。
看来Spring似乎应该提供一个更清晰的方法来处理这个问题。如果有人有其他建议,他们将不胜感激。
我建议在Spring论坛上提问,你可能会在那里得到一个很好的答案。 – skaffman 2009-07-01 15:18:45