sirve settitle que para java spring spring-aop spring-jdbc transactional

java - settitle - Primavera-@Transaccional-¿Qué sucede en el fondo?



para que sirve settitle en java (4)

Como persona visual, me gusta incluir un diagrama de secuencia del patrón proxy. Si no sabes cómo leer las flechas, leí el primero de esta manera: El Client ejecuta Proxy.method() .

  1. El cliente llama a un método en el objetivo desde su perspectiva y es interceptado silenciosamente por el proxy
  2. Si se define un aspecto anterior, el proxy lo ejecutará.
  3. Entonces, se ejecuta el método real (objetivo)
  4. Después de regresar y después de lanzar son aspectos opcionales que se ejecutan después de que el método devuelve y / o si el método lanza una excepción
  5. Después de eso, el proxy ejecuta el aspecto posterior (si está definido)
  6. Finalmente el proxy vuelve al cliente que llama.

(Se me permitió publicar la foto a condición de que mencionara sus orígenes. Autor: Noel Vaes, sitio web: www.noelvaes.eu)

Quiero saber qué sucede realmente cuando se anota un método con @Transactional ? Por supuesto, sé que Spring envolverá ese método en una transacción.

Pero, tengo las siguientes dudas:

  1. He oído que Spring crea una clase proxy ? ¿Alguien puede explicar esto con más profundidad ? ¿Qué reside realmente en esa clase de proxy? ¿Qué pasa con la clase real? ¿Y cómo puedo ver la clase creada por proxy de Spring?
  2. También leí en Spring docs que:

Nota: Dado que este mecanismo se basa en proxies, solo se interceptarán las llamadas a métodos "externos" que lleguen a través del proxy . Esto significa que ''auto-invocación'', es decir, un método dentro del objeto de destino que llama a otro método del objeto de destino, no conducirá a una transacción real en tiempo de ejecución, incluso si el método invocado está marcado con @Transactional !

Fuente: http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

¿Por qué solo las llamadas a métodos externos estarán bajo Transacción y no los métodos de auto-invocación?


Cuando Spring carga sus definiciones de bean y se ha configurado para buscar @ anotaciones transaccionales, creará estos objetos proxy alrededor de su bean real. Estos objetos proxy son instancias de clases que se generan automáticamente en tiempo de ejecución. El comportamiento predeterminado de estos objetos proxy cuando se invoca un método es simplemente invocar el mismo método en el bean "target" (es decir, su bean).

Sin embargo, los proxies también pueden suministrarse con interceptores, y cuando están presentes, estos interceptores serán invocados por el proxy antes de que invoque el método de su bean objetivo. Para los beans de destino anotados con @Transactional, Spring creará un TransactionInterceptor y lo pasará al objeto proxy generado. Entonces, cuando llama al método desde el código del cliente, está llamando al método en el objeto proxy, que primero invoca al TransactionInterceptor (que comienza una transacción), que a su vez invoca el método en su bean objetivo. Cuando finaliza la invocación, el TransactionInterceptor confirma / revierte la transacción. Es transparente al código del cliente.

En cuanto a la cosa del "método externo", si su bean invoca uno de sus propios métodos, entonces no lo hará a través del proxy. Recuerde, Spring envuelve su bean en el proxy, su bean no tiene conocimiento de ello. Sólo las llamadas desde "fuera" de su bean pasan por el proxy.

¿Eso ayuda?


Este es un gran tema. El documento de referencia de Spring le dedica múltiples capítulos. Recomiendo leer los de Programación y Transactions orientadas a aspectos , ya que el soporte declarativo de transacciones de Spring utiliza AOP como base.

Pero a un nivel muy alto, Spring crea proxies para las clases que declaran @Transactional en la propia clase o en los miembros. El proxy es en su mayoría invisible en tiempo de ejecución. Proporciona una forma para que Spring inyecte comportamientos antes, después o alrededor de las llamadas de método al objeto que se está procesando. La administración de transacciones es solo un ejemplo de los comportamientos que se pueden conectar. Las comprobaciones de seguridad son otro. Y también puede proporcionar el suyo propio, para cosas como el registro. Entonces, cuando realiza anotaciones en un método con @Transactional , Spring crea dinámicamente un proxy que implementa la misma interfaz que la clase que está anotando. Y cuando los clientes realizan llamadas a su objeto, las llamadas se interceptan y los comportamientos se inyectan a través del mecanismo proxy.

Las transacciones en EJB funcionan de manera similar, por cierto.

Como observó, el mecanismo de proxy solo funciona cuando las llamadas provienen de algún objeto externo. Cuando hace una llamada interna dentro del objeto, realmente está haciendo una llamada a través de la referencia " this ", que pasa por alto el proxy. Sin embargo, hay formas de solucionar ese problema. Explico un enfoque en esta publicación del foro en el que utilizo un BeanFactoryPostProcessor para inyectar una instancia del proxy en las clases de "referencia automática" en el tiempo de ejecución. Guardo esta referencia a una variable miembro llamada " yo ". Luego, si necesito hacer llamadas internas que requieran un cambio en el estado de la transacción del hilo, dirijo la llamada a través del proxy (por ejemplo, " me.someMethod () "). La publicación del foro lo explica con más detalle. Tenga en cuenta que el código de BeanFactoryPostProcessor sería un poco diferente ahora, ya que se escribió en el marco de tiempo de Spring 1.x. Pero espero que te dé una idea. Tengo una versión actualizada que probablemente podría poner a disposición.


La respuesta más simple es, en cualquier método que declare @Transactional, el límite de la transacción comienza y el límite finaliza cuando el método se completa.

Si está utilizando la llamada JPA, todas las confirmaciones están en este límite de transacción. Digamos que estás salvando entidad1, entidad2 y entidad3. Ahora, mientras se guarda la entidad3, se produce una excepción, ya que la entidad1 y la entidad2 entran en la misma transacción, por lo que la entidad1 y la entidad2 se revertirán con la entidad3.

Transacción: (entity1.save, entity2.save, entity3.save). Cualquier excepción dará lugar a la reversión de todas las transacciones JPA con DB. Las transacciones internas de JPA son utilizadas por Spring.