在Scala中使用Spring @Transactional

时间:2010-12-08 09:30:09

标签: spring scala transactional aspects

我们有一个混合的Java和Scala项目,它使用Spring事务管理。我们使用Spring方面用@Transactional注释方法编织文件。

问题是,Scala类不是与Spring事务方面编织在一起的。如何配置Spring以在Scala中考虑事务?

3 个答案:

答案 0 :(得分:3)

Spring需要您的事务边界以Spring管理的bean开头,因此这排除了@Transactional Scala类。

听起来简单的解决方案是将@Transactional Java类的服务外观实例化为Spring bean。这些可以委托给您的Scala服务/核心代码。

答案 1 :(得分:2)

答案 2 :(得分:1)

Spring中对Scala的@Transactional支持没有什么特别之处,您可以在没有任何Java代码的情况下使用它。只要确保你有bean的“纯”特征,哪些实现将使用@Transactional注释。您还应声明一个PlatformTransactionManager类型的bean(如果您使用的是基于.xml的Spring配置,则应使用“transactionManager”作为bean名称,有关详细信息,请参阅EnableTransactionManagement's JavaDoc)。此外,如果您使用基于注释的配置类,请确保将这些类放在它们自己的专用文件中,即不要将任何其他类(伴随对象都可以)放在同一个文件中。这是一个简单的工作示例:

SomeService.scala:

trait SomeService {
  def someMethod()
}

// it is safe to place impl in the same file, but still avoid doing it
class SomeServiceImpl extends SomeService {
  @Transactional
  def someMethod() {
    // method body will be executed in transactional context
  }
}

AppConfiguration.scala:

@Configuration
@EnableTransactionManagement
class AppConfiguration {
  @Bean
  def transactionManager(): PlatformTransactionManager = {
    // bean with PlatformTransactionManager type is required
  }

  @Bean
  def someService(): SomeService = {
    // someService bean will be proxied with transaction support
    new SomeServiceImpl
  }
}

// companion object is OK here
object AppConfiguration {
  // maybe some helper methods  
}

// but DO NOT place any other trait/class/object in this file, otherwise Spring will behave incorrectly!