2010-06-23 14 views

Respuesta

8

Sí, usando aop:config y tx:advice. Por ejemplo:

<aop:config> 
    <aop:pointcut id="serviceMethods" 
     expression="execution(* com.package.service..*.*(..))" /> 

    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" /> 
</aop:config> 

<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 
+1

yup, puede ver las diferentes posibilidades aquí: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative –

3

Una anotación es la mejor opción para marcar que un método se debe ejecutar en una transacción. Esto se recomienda para Spring y EJB 3.

El enfoque XML requiere mucha más configuración, no es refactorizado y debe ver en la configuración si se ejecutará o no un método determinado en una transacción.

Dado que el soporte de transacciones basado en anotaciones es la opción preferida por la mayoría de los desarrolladores y no desea utilizar la anotación de Spring @Transactional, le recomendaré que use una anotación personalizada.

entonces usted tiene dos opciones:

  • Deje que su anotación personalizada extender la primavera de @Transactional y utilizar el elemento <tx:annotation-driven /> en la configuración de la primavera. Esto es fácil y solo se necesita actualizar una anotación para eliminar la dependencia de Spring.
  • Crea un interceptor que ejecuta la lógica antes y después del método anotado. Con Spring como contenedor, debe delegar el manejo de transacciones del interceptor antes y después de su implementación de PlatformTransactionManager preferida.

He escrito sobre cómo se puede crear un interceptor que agrega lógica antes y después de un método marcado con una anotación here. Y demostró qué métodos debe usar en PlatformTransactionManager here.

Espero que esto ayude!

Cuestiones relacionadas