2011-04-05 10 views

Respuesta

26

Buena pregunta. Siempre lo puse en la implementación. Tal vez porque es un detalle de implementación, en lugar de una abstracción.

Puede desear que diferentes implementaciones tengan diferentes comportamientos transaccionales.

El Guapo señaló que, además de eso, hay más problemas que pueden surgir al poner en la interfaz, relacionados con la estrategia de proxy.

+0

hace otro muy buen punto. ¡Buen comentario! –

+1

¿Alguien sabe lo que dice la especificación JTA con respecto a la anotación? ¿Deben los proveedores verificar la firma del método del supertipo para la anotación? Y más al punto, si uno reemplaza un método anotado con una versión no anotada, ¿cómo es percibido por un procesador/reflexión de anotación? –

38

Realmente todo depende de la arquitectura de su aplicación, en mi opinión. Depende de cómo estés transmitiendo tus clases. Si usted tiene su aplicación se establece en proxy-target-class='true' (en su contexto de aplicación, entonces su información @Transactional ser recogido costumbre arriba si usted anotar la interfaz.

Salida The Spring Docs -- "Tips" para más información.

primavera recomienda que sólo anotar clases concretas (y métodos de clases concretas) con la anotación @Transactional, en lugar de anotar las interfaces. Sin duda, puede colocar la anotación @Transactional en una interfaz (o un método de interfaz), pero esto funciona solo como cabría esperar. si está utilizando proxies basados ​​en interfaz. El hecho de que las anotaciones Java no se hereden de las interfaces significa que si está utilizando class-ba sed proxies (proxy-target-class = "true") o el aspecto basado en el tejido (mode = "aspectj"), entonces la configuración de transacción no es reconocida por la infraestructura de proxying y weaving, y el objeto no será envuelto en una proxy transaccional, que sería decididamente malo.

+1

+1 para la propina. Estoy editando tu respuesta para agregar un presupuesto – Bozho

1

Si bien la gestión de transacciones es un detalle de implementación, en muchos casos también es un detalle de la interfaz. Por ejemplo, al definir la interfaz de los servicios de su aplicación, puede considerar poner @Transactional en la definición de la interfaz para aclarar específicamente qué estrategia de propagación está utilizando.

0

No uso interfaces en mi sistema porque hasta ahora realmente no veo si será posible implementar algo sobre él. Así que puse anotaciones sobre la implementación y creo que Spring me haría las cosas bien.

No creo que todas las clases tengan interfaces. Veo muchas arquitecturas con muchos patrones y todas adoran las interfaces. Pero una pregunta: si coloca la anotación Spring en la interfaz y usted, por alguna razón, desea otro enfoque para la transacción de una clase de implementación realizada a través de esta interfaz, no podría hacer eso. ¿O estoy equivocado?

Saludos.

Cuestiones relacionadas