是的,可以在私有方法上使用@Transactional,但是正如其他人提到的那样,这将无法立即使用。您需要使用AspectJ。我花了一些时间弄清楚如何使其工作。我将分享我的结果。
我选择使用编译时编织而不是加载时编织,因为我认为这是总体上更好的选择。另外,我使用的是Java 8,因此您可能需要调整一些参数。
首先,添加aspectjrt的依赖项。
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
然后添加AspectJ插件在Maven中进行实际的字节码编织(这可能不是一个最小的示例)。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.8</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
最后将此添加到您的配置类
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
现在您应该可以在私有方法上使用@Transactional了。
这种方法的一个警告:您将需要配置IDE以了解AspectJ,否则,例如,如果您通过Eclipse运行该应用程序,则可能无法正常工作。确保针对直接的Maven构建进行测试以进行完整性检查。