gpt4 book ai didi

Spring @Transactional v Spring Security @Secured 不一致的行为

转载 作者:行者123 更新时间:2023-12-04 15:36:21 27 4
gpt4 key购买 nike

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

Where should I put @Transactional annotation: at an interface definition or at an implementing class?

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

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

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

最佳答案

当同时使用 JDK 代理和 CGLib 时,您最终会得到 TransactionInterceptor对于 @TransactionalMethodSecurityInterceptor对于 @Secured .

但是那两个MethodInterceptors使用不同的机制在给定的 MethodInvocation 上查找注释.

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

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

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

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

关于Spring @Transactional v Spring Security @Secured 不一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441472/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com