6

Spring 文档建议将 @Transactional 注释放在具体的类/方法而不是接口上。其原因已在 Stack Overflow 上多次介绍过,例如:

我应该将@Transactional 注释放在哪里:在接口定义或实现类中?

Spring Security @Secured 行为不同;大多数文档显示将注释放在界面上。事实上,无论您是注释接口还是具体类,无论您使用 JDK 还是 CGLib 代理,它似乎都有效。

这似乎是一个优越的解决方案。那么为什么不一致呢?对上述问题的一个答案表明对性能有影响......但性能肯定对安全性同样重要吗?!

以及@Secured 解决方案如何处理菱形继承问题(类实现 2 个接口都具有不同的@Secured 相同方法)?

4

1 回答 1

3

当同时使用 JDK 代理和 CGLib 时,您最终会使用@TransactionalTransactionInterceptor@SecuredMethodSecurityInterceptor

但是这两个MethodInterceptor使用不同的机制来查找给定MethodInvocation的注释。

@Secured 注解由SecuredAnnotationSecurityMetadataSource使用AnnotationUtils.findAnnotation(Method method, Class<A> annotationType)方法找到,而 @Transactional 由AnnotationTransactionAttributeSource在SpringTransactionAnnotationParser的帮助下找到。

看起来 AnnotationUtils 具有更高级的查找注解、搜索接口和声明类层次结构的方法的机制。

您可以创建自己的使用 AnnotationUtils 的TransactionAnnotationParser,这应该启用与 @Transactional 相同的功能。

AnnotationUtils 返回第一个找到的注释,这就是处理钻石继承的方式。

于 2011-12-09T21:50:56.887 回答