Puede ponerlos en la interfaz, pero tenga en cuenta que es posible que las transacciones no terminen ocurriendo en algunos casos. Vea el segundo consejo en la Sección 10.5.6 de los documentos de Spring:
Spring recomienda que solo anote clases concretas (y métodos de clases concretas) con la anotación @Transactional, en lugar de anotar interfaces. Sin duda, puede colocar la anotación @Transactional en una interfaz (o un método de interfaz), pero esto solo funciona como lo esperaría si está utilizando proxies basados en interfaz. El hecho de que las anotaciones de Java no se hereden de las interfaces significa que si está utilizando proxies basados en clases (proxy-target-class = "true") o el aspecto basado en tejido (mode = "aspectj"), la configuración de la transacción es no reconocido por la infraestructura de proxy y tejido, y el objeto no se incluirá en un proxy transaccional, lo que sería definitivamente malo.
Recomendaría ponerlos en la implementación por este motivo.
Además, para mí, las transacciones parecen un detalle de implementación, por lo que deberían estar en la clase de implementación. Imagínese tener implementaciones de contenedor para el registro o implementaciones de prueba (simulacros) que no necesitan ser transaccionales.
JdkDynamicAopProxy
pasa por todos los asesores de beans en cada invocación de método (ver tambiénDefaultAdvisorChainFactory#getInterceptorsAndDynamicInterceptionAdvice()
), que en caso de configuración de transacción declarativa, incluyeBeanFactoryTransactionAttributeSourceAdvisor
. A su vezTransactionAttributeSourcePointcut#matches()
se invoca, que debe recoger la información relativa a la transacción. Se pasa a la clase de destino y siempre puede atravesar todas las interfaces que implementa esta clase. Ahora: ¿por qué esto no puede funcionar de manera confiable?@Transactional
anotaciones heredadas se aplicaría? Entonces, aunque todo es posible , no culpo a Spring. jira.springsource.org/browse/SPR-975