07-11-2006 Raul Vicente
Continuando con en post sobre manejo declarativo de transacciones en Spring 1.2, está vez abordaré las diferencias de hacer la misma tarea en Spring 2.0. La mayor diferencia es que mientras que Spring 1.2 utilizaba Spring AOP que era muy limitado ya que sólo permitía programación orientada a aspectos a nivel de método, Spring 2.0 se integra perfectamente con AspectJ dando toda la potencia de la programación orientada a aspectos, pero facilitando la sintaxis. Es decir, Spring 2.0 propone programar los aspectos en AspectJ pero de manera declarativa, también ofrece la posibilidad de utilizar annotations tanto para definir aspectos como para realizar transacciones de manera declarativa. En este post abordaré como realizar transacciones de manera declarativa dejando el tema de los aspectos para otro post, a su vez tan sólo especificaré lo que cambia respecto a Spring 1.2 así que el que tenga dudas puede revisar este post.
Una vez terminada la introducción lo mejor es demostrar el movimiento andando:
Lo único que habría que cambiar es la declaración del aspecto y el número de archivos xsd que hay que importar, no voy a especificar la declaración del tag beans para no alargar, los que tengan dudas pueden mirar la documentación de Spring.
< aop:config >
< aop:pointcut id="fooServiceOperation"
expression=”execution(* org.mipaquete.core.domain.logic.Facade.*(..))”/ >
< aop:advisor advice-ref="txAdvice" pointcut-ref="facade"/ >
< /aop:config>
< tx:advice id="txAdvice" transaction-manager="txManager" >
< tx:attributes >
< tx:method name="get*"
propagation=”PROPAGATION_REQUIRED” read-only=”true”/ >
< tx:method name="*"
propagation=”PROPAGATION_REQUIRED”/ >
< /tx:attributes >
< /tx:advice>
Para los no familiariazados con AspectJ lo que símplemente se hace es definir un pointcut en el que se va a aplicar el aspecto y el aspecto en sí mismo, en este caso el aspecto se va a aplicar a todos lo métodos de la clase org.mipaquete.core.domain.logic.Facade, en cuanto aspecto se ha simplificado bastante el xml y se entiende bastante bien una vez leído el post sobre Spring 1.2. Al no ponerle nivel de aislamiento a la transacción se toma el nivel de aislamiento por defecto y si no especificáramos el atributo propagation se tomaría por defecto PROPAGATION_REQUIRED.
Por supuesto, la clase org.mipaquete.core.domain.logic.Facade ha de estar dada de alta en el contexto de Spring.
Otra ventaja que ofrece Spring 2.0 es la posibilidad de utilizar annotations lo cual hace que podamos simplificar el XML pero liga la aplicación al container de Spring, esto es muy bueno para realizar prototipos rápidos pero se desaconseja a la hora de desarrollar la aplicación final ya que se aconseja que la aplicación esté lo más desacoplada posible, en ese caso lo mejor es realizar la aplicación con el XML.
Para utilizar annotations, habría que quitar del XML todo lo que tenga que ver con el aspecto de transaccionalidad ya que esto ahora se función de las annotations.
El código quedaría así:
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public interface Facade {
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
List getUsuarios();
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
Usuario getUsuario(int idUsuario);
void añadirUsuario(Usuario usuario);
void modificarUsuario(Usuario usuario);
void eliminarUsuario(int idUsuario);
}
Esto es más natural para el programador y hace lo mismo que el aspecto declarado en el XML anteriormente, aplica a todos los métodos de la clase Facade readOnly=false y propagation.Required excepto a los de lectura utilizando la annotation @Transactional.
Por supuesto para que esto funcione hay que habilitar las annotations para transacciones esto se hace añadiendo esto al XML este código:
< tx:annotation-driven transaction-manager="txManager"/ >
< bean id="txManager"
class=”org.springframework.jdbc.datasource.DataSourceTransactionManager” >
< property name="dataSource" ref="dataSource"/ >
< /bean >
Para los que deseís ampliar más vuestros conocimientos la documentación de Spring se encuentra en esta página, en concreto, en el capítulo 9:
http://static.springframework.org/spring/docs/2.0.x/reference/index.html