Java 在@Transactional方法之前和之后执行代码
我们有一个基于Spring的应用程序,其服务层用@Transactional注释。出于以下原因,我们需要在某些事务方法之前和之后运行代码:Java 在@Transactional方法之前和之后执行代码,java,spring,Java,Spring,我们有一个基于Spring的应用程序,其服务层用@Transactional注释。出于以下原因,我们需要在某些事务方法之前和之后运行代码: 我们需要基于密钥同步对该方法的访问。线程需要在事务开始之前阻塞 如果事务成功,我们需要在队列上发布消息 选择似乎是: 创建一个类,该类使用与服务类似的方法,可以在同步块中运行@Transactional方法,并检查返回,然后发布消息(由于AOP代理问题,需要单独的类)。服务呼叫服务,不好,感觉像是一种工作 编写一个方面来包装@Transactional AO
否则,您可以将方法中的逻辑移出到一个单独的服务中,使该新服务成为@Transactional,从当前方法中删除@Transactional,然后使用事务前和事务后逻辑围绕对新服务的调用。我也采用了这种方法,但我更喜欢这样的需求,因为我认为它更干净,而且正如您所提到的,调用服务的服务(只有第一个服务才需要)感觉像是一种黑客的解决方法。我想我会选择2,除非您有一些特定的理由避免AOP。您的问题是可以使用AOP的一个经典示例,结果看起来相当不错。下面是一个很好的示例,说明了如何实现这一点(如果您还没有读过的话):
如果AOP真的不是一个选项,我会选择@Lawrence McAlpin提出的“否则”选项。检查回调接口。Spring可以以本机方式通知您事务发生了什么。如果密钥作为方法调用的一部分传递,那么您可以使用java来完成这项工作。。它更简单、更干净。同意这一点,我不明白在这种情况下为什么要避免AOP。这是最干净的方法,毕竟@Transactional也使用AOP。因此,连接另一个方面将是最好和最简单的事情。一定要使用AOP。正如@Sean所指出的,您已经将SpringAOP与@Transactional一起使用,Spring特别支持,因此您可以告诉它在不需要额外工作的情况下运行每个@Transactional方法。谢谢。没有根本的理由避免AOP,只是个人偏好和过去的一些不好的经历!我倾向于为同步需求编写一个方面,因为它似乎适合AOP最擅长的方面,即真正的横切。对于“在事务提交时做一些事情”的要求,我喜欢Tomasz提到的回调解决方案。这对于Tomasz的消息发布要求非常有用,谢谢。事实上,这可能是解决其他几个长期存在的问题的方法,这很好。