SlideShare una empresa de Scribd logo
1 de 12
Descargar para leer sin conexión
Spring’s
annotations: Proxy
José Canfrán (Osoco)
September 2015
Programming Gotchas & Pitfalls Series
@Transactional1
Ejemplo
package es.osoco.lightTalk
import org.springframework.transaction.annotation.Transactional
class TransactionalService {
@Transactional
def firstMethod() {
anotherMethod()
// code
}
@Transactional // @Transactional(propagation = Propagation.REQUIRES_NEW)
private anotherMethod() {
// code
}
}
Spring: Proxy
La anotación Transactional de Spring crea un proxy en tiempo de ejecución de la clase, el cual tiene a
su vez una instancia de la clase original.
Todas las llamadas a métodos transaccionales son interceptadas por el proxy, que es el encargado
de iniciar una transacción, unirse a la existente… y llamar al método del servicio.
Pero si se hace una llamada a métodos del mismo servicio, el proxy no podrá interceptarla al
encontrarnos por debajo de él, en su instancia del servicio y no se ejecutará la condiciones de
transacción que hayamos puesto.
Posibles soluciones
● Grails < 2.3.1
○ Usar .withTransaction()
● Grails > 2.3.1
○ Usar @grails.transaction.Transactional: Durante la compilación
mediante una transformación AST, se crea un nuevo método por cada
método anotado dentro de una GrailsTransactionTemplate que ejecuta
el código del original con los ajustes de transacción.Ya no existe proxy y
como se ha hecho la misma operación con todos los métodos no hay
problemas con las llamadas directas. (Puede fallar con la anotación
@CompileStatic)
@Cacheable2
Ejemplo
package es.osoco.lightTalk
import org.springframework.cache.annotation.Cacheable
class CacheableService {
def firstMethod() {
anotherMethod(param1, param2)
// code
}
@Cacheable
private anotherMethod(param1, param2) {
// code
}
}
Solución3
Obtener proxy: En el servicio
package es.osoco.lightTalk
import org.springframework.cache.annotation.Cacheable
class CacheableService {
def firstMethod() {
proxy.anotherMethod(param1, param2)
// code
}
@Cacheable
private anotherMethod(param1, param2) {
// code
}
private getProxy() {
def proxy = grailsApplication.mainContext.cacheableService
}
}
De este modo obtenemos el proxy
para llamar al método a través de él.
Obtener proxy: Genérico
class BootStrap {
def grailsApplication
def init = { servletContext ->
for( sc in grailsApplication.serviceClasses) {
sc.clazz.metaClass.getMyProxy = { ->
grailsApplication.mainContext.getBean(sc.propertyName)
}
}
}
De este modo estará disponible la variable myProxy con el proxy correspondiente en cada
servicio.
Bibliografía
◉ Programming Grails (0’Reilly)
Burt Beckwith, ISBN: 9 781449 323936
◉ Documentación Grails
https://grails.org/documentation.html
Any questions ?
You can find me at
◉ @jose_cg
Thanks!
This work is licensed under a Creative Commons
Attribution 4.0 International License.

Más contenido relacionado

La actualidad más candente

La actualidad más candente (7)

Prepared Statement
Prepared StatementPrepared Statement
Prepared Statement
 
Transacciones
TransaccionesTransacciones
Transacciones
 
Sincronizacion
SincronizacionSincronizacion
Sincronizacion
 
Programacion I
Programacion I Programacion I
Programacion I
 
Slides sesion8 matlab - IF y bucles
Slides sesion8 matlab - IF y buclesSlides sesion8 matlab - IF y bucles
Slides sesion8 matlab - IF y bucles
 
Chap 15bpin
Chap 15bpinChap 15bpin
Chap 15bpin
 
Register Global
Register GlobalRegister Global
Register Global
 

Destacado

Proactive monitoring with Monit
Proactive monitoring with MonitProactive monitoring with Monit
Proactive monitoring with MonitOSOCO
 
Understanding Java Dynamic Proxies
Understanding Java Dynamic ProxiesUnderstanding Java Dynamic Proxies
Understanding Java Dynamic ProxiesOSOCO
 
AWS CloudFormation en 5 Minutos
AWS CloudFormation en 5 MinutosAWS CloudFormation en 5 Minutos
AWS CloudFormation en 5 MinutosOSOCO
 
SSH Tunneling Recipes
SSH Tunneling RecipesSSH Tunneling Recipes
SSH Tunneling RecipesOSOCO
 
MADBike – Destapando la seguridad de BiciMAD (T3chFest 2017)
MADBike – Destapando la seguridad de BiciMAD (T3chFest 2017)MADBike – Destapando la seguridad de BiciMAD (T3chFest 2017)
MADBike – Destapando la seguridad de BiciMAD (T3chFest 2017)Alex Rupérez
 
NSCoder Keynote - Multipeer Connectivity Framework
NSCoder Keynote - Multipeer Connectivity FrameworkNSCoder Keynote - Multipeer Connectivity Framework
NSCoder Keynote - Multipeer Connectivity FrameworkAlex Rupérez
 
Gigigo Keynote - Geofences & iBeacons
Gigigo Keynote - Geofences & iBeaconsGigigo Keynote - Geofences & iBeacons
Gigigo Keynote - Geofences & iBeaconsAlex Rupérez
 
Gigigo Workshop - Create an iOS Framework, document it and not die trying
Gigigo Workshop - Create an iOS Framework, document it and not die tryingGigigo Workshop - Create an iOS Framework, document it and not die trying
Gigigo Workshop - Create an iOS Framework, document it and not die tryingAlex Rupérez
 
Gigigo Workshop - iOS Extensions
Gigigo Workshop - iOS ExtensionsGigigo Workshop - iOS Extensions
Gigigo Workshop - iOS ExtensionsAlex Rupérez
 

Destacado (11)

Polyglot Grails
Polyglot GrailsPolyglot Grails
Polyglot Grails
 
Proactive monitoring with Monit
Proactive monitoring with MonitProactive monitoring with Monit
Proactive monitoring with Monit
 
Polyglot JVM
Polyglot JVMPolyglot JVM
Polyglot JVM
 
Understanding Java Dynamic Proxies
Understanding Java Dynamic ProxiesUnderstanding Java Dynamic Proxies
Understanding Java Dynamic Proxies
 
AWS CloudFormation en 5 Minutos
AWS CloudFormation en 5 MinutosAWS CloudFormation en 5 Minutos
AWS CloudFormation en 5 Minutos
 
SSH Tunneling Recipes
SSH Tunneling RecipesSSH Tunneling Recipes
SSH Tunneling Recipes
 
MADBike – Destapando la seguridad de BiciMAD (T3chFest 2017)
MADBike – Destapando la seguridad de BiciMAD (T3chFest 2017)MADBike – Destapando la seguridad de BiciMAD (T3chFest 2017)
MADBike – Destapando la seguridad de BiciMAD (T3chFest 2017)
 
NSCoder Keynote - Multipeer Connectivity Framework
NSCoder Keynote - Multipeer Connectivity FrameworkNSCoder Keynote - Multipeer Connectivity Framework
NSCoder Keynote - Multipeer Connectivity Framework
 
Gigigo Keynote - Geofences & iBeacons
Gigigo Keynote - Geofences & iBeaconsGigigo Keynote - Geofences & iBeacons
Gigigo Keynote - Geofences & iBeacons
 
Gigigo Workshop - Create an iOS Framework, document it and not die trying
Gigigo Workshop - Create an iOS Framework, document it and not die tryingGigigo Workshop - Create an iOS Framework, document it and not die trying
Gigigo Workshop - Create an iOS Framework, document it and not die trying
 
Gigigo Workshop - iOS Extensions
Gigigo Workshop - iOS ExtensionsGigigo Workshop - iOS Extensions
Gigigo Workshop - iOS Extensions
 

Similar a Spring annotations: Proxy and Cache

Similar a Spring annotations: Proxy and Cache (20)

algorimo distribuidos
algorimo distribuidosalgorimo distribuidos
algorimo distribuidos
 
Procedures funciones
Procedures funcionesProcedures funciones
Procedures funciones
 
Funciones
FuncionesFunciones
Funciones
 
Procedures funciones
Procedures funcionesProcedures funciones
Procedures funciones
 
RMI
RMIRMI
RMI
 
6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mv6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mv
 
Mecanismos de exclusion mutua y algoritmos
Mecanismos de exclusion mutua y algoritmosMecanismos de exclusion mutua y algoritmos
Mecanismos de exclusion mutua y algoritmos
 
Spring OSGI , dm server - Leonardo Torres Altez
Spring OSGI , dm server - Leonardo Torres AltezSpring OSGI , dm server - Leonardo Torres Altez
Spring OSGI , dm server - Leonardo Torres Altez
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Sistemas operativos unidad 2
Sistemas operativos unidad 2Sistemas operativos unidad 2
Sistemas operativos unidad 2
 
Progra
PrograProgra
Progra
 
Sistemas operativos distribuidos ii
Sistemas operativos distribuidos iiSistemas operativos distribuidos ii
Sistemas operativos distribuidos ii
 
Fundamentos de la Refactorización
Fundamentos de la RefactorizaciónFundamentos de la Refactorización
Fundamentos de la Refactorización
 
Viernes Tecnicos DTrace
Viernes Tecnicos DTraceViernes Tecnicos DTrace
Viernes Tecnicos DTrace
 
Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
Ejemplosencillocon rmi
Ejemplosencillocon rmiEjemplosencillocon rmi
Ejemplosencillocon rmi
 
Multitarea
MultitareaMultitarea
Multitarea
 
Networking
NetworkingNetworking
Networking
 
Manuales ...
Manuales ...Manuales ...
Manuales ...
 
My Sql A C#
My Sql A C#My Sql A C#
My Sql A C#
 

Spring annotations: Proxy and Cache

  • 1. Spring’s annotations: Proxy José Canfrán (Osoco) September 2015 Programming Gotchas & Pitfalls Series
  • 3. Ejemplo package es.osoco.lightTalk import org.springframework.transaction.annotation.Transactional class TransactionalService { @Transactional def firstMethod() { anotherMethod() // code } @Transactional // @Transactional(propagation = Propagation.REQUIRES_NEW) private anotherMethod() { // code } }
  • 4. Spring: Proxy La anotación Transactional de Spring crea un proxy en tiempo de ejecución de la clase, el cual tiene a su vez una instancia de la clase original. Todas las llamadas a métodos transaccionales son interceptadas por el proxy, que es el encargado de iniciar una transacción, unirse a la existente… y llamar al método del servicio. Pero si se hace una llamada a métodos del mismo servicio, el proxy no podrá interceptarla al encontrarnos por debajo de él, en su instancia del servicio y no se ejecutará la condiciones de transacción que hayamos puesto.
  • 5. Posibles soluciones ● Grails < 2.3.1 ○ Usar .withTransaction() ● Grails > 2.3.1 ○ Usar @grails.transaction.Transactional: Durante la compilación mediante una transformación AST, se crea un nuevo método por cada método anotado dentro de una GrailsTransactionTemplate que ejecuta el código del original con los ajustes de transacción.Ya no existe proxy y como se ha hecho la misma operación con todos los métodos no hay problemas con las llamadas directas. (Puede fallar con la anotación @CompileStatic)
  • 7. Ejemplo package es.osoco.lightTalk import org.springframework.cache.annotation.Cacheable class CacheableService { def firstMethod() { anotherMethod(param1, param2) // code } @Cacheable private anotherMethod(param1, param2) { // code } }
  • 9. Obtener proxy: En el servicio package es.osoco.lightTalk import org.springframework.cache.annotation.Cacheable class CacheableService { def firstMethod() { proxy.anotherMethod(param1, param2) // code } @Cacheable private anotherMethod(param1, param2) { // code } private getProxy() { def proxy = grailsApplication.mainContext.cacheableService } } De este modo obtenemos el proxy para llamar al método a través de él.
  • 10. Obtener proxy: Genérico class BootStrap { def grailsApplication def init = { servletContext -> for( sc in grailsApplication.serviceClasses) { sc.clazz.metaClass.getMyProxy = { -> grailsApplication.mainContext.getBean(sc.propertyName) } } } De este modo estará disponible la variable myProxy con el proxy correspondiente en cada servicio.
  • 11. Bibliografía ◉ Programming Grails (0’Reilly) Burt Beckwith, ISBN: 9 781449 323936 ◉ Documentación Grails https://grails.org/documentation.html
  • 12. Any questions ? You can find me at ◉ @jose_cg Thanks! This work is licensed under a Creative Commons Attribution 4.0 International License.