Spring中基于模式的事务

JSS*_*JSS 1 java spring jpa transactions

我们将Spring + JPA用于RESTful Web服务应用程序.这是一个高事务性应用程序,并执行大量的CRUD操作.

@Transaction在方法上使用注释来执行事务,一切正常.

我只是想知道是否可以在配置文件中基于模式匹配在类外部管理事务,即所有以add/update/delete开头的方法都可以自动启用事务处理(不使用@Transaction注释)?

有人可以确认是否可能吗?

如果"是",请提供一些网站链接或示例.

谢谢.

Tom*_*icz 5

当然!事实上,这是Java 5和@Transactional注释之前唯一可行的解​​决方案.查看10.5.2 Spring文档中声明性事务实现的示例.在那里,您将找到通过XML和AspectJ切入点进行事务划分配置的示例.

这是上面文档中的简单配置摘录:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <!-- ... -->
        </bean>
    </property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true"/>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
</aop:config>
Run Code Online (Sandbox Code Playgroud)

如您所见,所有名称前缀的方法get都标记为只读,而FooService(x.y.service.FooService.*(..))切入点)的所有其他方法都是事务性的而不是只读的.

正如您所看到的,使用更详细的XML语法为您提供了一些很好的好处,如声明式和更灵活的事务划分,主要得益于AspectJ语法(请务必先学习它).