我有2个问题,我无法为他们提供有关@Transactional的答案:
1-接口上的@Transnational
根据答案:
如果您将应用程序设置为proxy-target-class ='true'(在您的应用程序上下文中,则在对接口进行注释时,不会获取@Transactional信息。
我使用以下命令配置了application.properties:
spring.aop.proxy-target-class=true
并且接口上的注释仍然被拾取,我也尝试了以下操作({{1}上的proxyTargetClass = true
):
EnableTransacationManagement
@Transnational仍在我仅在接口上配置的地方工作,所以我在这里错过了什么?
2- @Transnational具有@ Inherited,@ inherited 按照java doc:
请注意,如果注释类型用于注释除类之外的任何内容,则此元注释类型无效。还要注意,此元注释仅使注释从超类继承;已实现的接口上的注释无效。
我有以下用@Transnational注释的接口,它仍在扩展它的接口上工作:
@SpringBootApplication
@EnableAsync
@EnableTransactionManagement(proxyTargetClass = true)
public class Application extends SpringBootServletInitializer {
}
以下/下面的接口具有修改后的查询,如果没有@Transactional,它将无法正常工作,我在上面的接口中使用@Transacational注释了该接口,并对其进行了拾取(即使我在父方法而不是在类上进行配置,它也可以使用):
@Repository
@Transactional
public interface UserRepository extends JpaRepository<User, Long> {
}
}
那么如果@Inherited对接口没有影响,事务如何工作?
更新:(针对问题1)
我什至在接口方法上尝试了@Async,并且它在不注释实现类的情况下也可以工作,AOP正在使用CGLIB代理(仅在注释接口方法时),这与大多数答案是矛盾的,不确定是否存在任何问题。 / p>
答案 0 :(得分:1)
您链接到的答案是针对Spring 3.0的,但是当前我们位于Spring 5.1。目前大约有7个版本,参考指南的该部分不再存在。
使用哪种代理模式都没关系,当在实现上找不到时,Spring总是会尝试在实现接口上找到@Transactional
注释。这是Spring的行为,是在Spring中特别实现的,这不同于默认的注释继承规则。 (通常在执行getAnnotation
时此操作无效,因此Spring实施了此操作)。另请参见Spring参考指南的this section。
此外,您还可以使用Spring Data JPA,它还专门为其创建的动态存储库添加元数据和注释处理。