SlideShare a Scribd company logo
Under the Hood: Using Spring in Grails

Burt Beckwith
SpringSource




                                                                 CONFIDENTIAL
                                   © 2010 SpringSource, A division of VMware. All rights reserved
Who Am I


 Java developer for over 13 years

 Background in Spring, Hibernate, Spring Security

 Grails developer for 5 years

 SpringSource employee on the Grails team

 Created or reworked over 40 Grails plugins

 http://burtbeckwith.com/blog/

 https://twitter.com/#!/burtbeckwith
                         CONFIDENTIAL               2
Spring Overview
 Main functions of Spring
 • Bean container: ApplicationContext and BeanFactory
 • Dependency Injection (DI) and Inversion of Control (IoC)
 • Proxies
   • Transactions
   • Security
   • Caching
 • Event publishing and listening
 • Exception conversion
                             CONFIDENTIAL                     3
Grails Services




      CONFIDENTIAL   4
Grails Services


 What is a Grails Service?




                              CONFIDENTIAL   5
Grails Services


 What is a Grails Service?

 • Groovy class in grails­app/services




                              CONFIDENTIAL   6
Grails Services


 What is a Grails Service?

 • Groovy class in grails­app/services

 • Great place for business logic




                              CONFIDENTIAL   7
Grails Services


 What is a Grails Service?

 • Groovy class in grails­app/services

 • Great place for business logic

 • A Spring bean, by default singleton scope




                              CONFIDENTIAL     8
Grails Services


 What is a Grails Service?

 • Groovy class in grails­app/services

 • Great place for business logic

 • A Spring bean, by default singleton scope

 • Automatically transactional unless configured otherwise



                              CONFIDENTIAL                   9
Grails Services


 What is a Grails Service?

 • Groovy class in grails­app/services

 • Great place for business logic

 • A Spring bean, by default singleton scope

 • Automatically transactional unless configured otherwise

 • Proxied, sometimes multiple times
                              CONFIDENTIAL               10
Manually Wiring




      CONFIDENTIAL   11
Grails Services
                    src/java/test/UserManager.java
  package test;

  import other.LoggingService;
  import auth.User;

  public class UserManager {

      private LoggingService loggingService;

      public void setLoggingService(LoggingService service) {
         loggingService = service;
      }

      public User createUser(String username) {
         User user = new User();
         user.setUsername(username);
         user.save();
         loggingService.logMessage(
              "Created user with username " + username);
         return user;
      }
  }

                                  CONFIDENTIAL                  12
Grails Services

                   grails-app/conf/spring/resources.groovy


  import test.UserManager

  beans = {
     userService(UserManager) {
        loggingService = ref('loggingService')
     }
  }




                                  CONFIDENTIAL               13
Grails Services

                   grails-app/conf/spring/resources.groovy


  import test.UserManager

  beans = {
     userService(UserManager) { bean ->
        bean.autowire = 'byName'
     }
  }




                                  CONFIDENTIAL               14
How to Make it Transactional?




             CONFIDENTIAL       15
Grails Services

                          grails-app/conf/spring/resources.groovy

import org.codehaus.groovy.grails.orm.support.GroovyAwareNamedTransactionAttributeSource
import org.springframework.transaction.interceptor.TransactionProxyFactoryBean

import test.UserManager

beans = {

    userService(TransactionProxyFactoryBean) { bean ->
       bean.lazyInit = true

        target = { innerBean ->
           innerBean.lazyInit = true
           innerBean.autowire = 'byName'
           innerBean.beanClass = UserManager
        }

        proxyTargetClass = true

        def props = ['*': 'PROPAGATION_REQUIRED'] as Properties
        TransactionAttributeSource =
            new GroovyAwareNamedTransactionAttributeSource(transactionalAttributes: props)

        transactionManager = ref('transactionManager')
    }
}

                                          CONFIDENTIAL                                 16
or




CONFIDENTIAL   17
Grails Services
                    src/java/test/UserManager.java
  package test;

  import org.springframework.transaction.annotation.Transactional;
  import other.LoggingService;
  import auth.User;

  @Transactional
  public class UserManager {

      private LoggingService loggingService;

      public void setLoggingService(LoggingService service) {
         loggingService = service;
      }

      public User createUser(String username) {
         ...
      }
  }




                                  CONFIDENTIAL                       18
Grails Services

                    grails-app/conf/spring/resources.groovy

import test.UserManager

beans = {

    userService(UserManager) { bean ->
       bean.lazyInit = true
       bean.autowire = 'byName'
    }
}




                                   CONFIDENTIAL               19
How to be sure it's 
 Transactional?




        CONFIDENTIAL   20
Grails Services
                            src/java/test/UserManager.java
package test;

import     org.springframework.transaction.TransactionStatus;
import     org.springframework.transaction.annotation.Transactional;
import     org.springframework.transaction.interceptor.TransactionAspectSupport;
import     org.springframework.transaction.support.TransactionSynchronizationManager;

    ...

    public User createUser(String username) {

        if (TransactionSynchronizationManager.isSynchronizationActive()) {
           TransactionStatus status = TransactionAspectSupport.currentTransactionStatus();
           System.out.println("TX is active; isRollbackOnly: " + status.isRollbackOnly());
        }
        else {
           System.out.println("Uh-oh, TX not active");
        }

        ...
    }
}




                                            CONFIDENTIAL                                 21
Grails Services
                  grails-app/services/test/UserService.groovy

  package test

  import auth.User

  class UserService {

      def loggingService

      User createUser(String username) {
         def user = new User(username: username)
         user.save()
         loggingService.logMessage(
              "Created user with username $username")
         user
      }
  }




                                    CONFIDENTIAL                22
Transaction Helper Methods




           CONFIDENTIAL      23
Utility Methods




  import o.s.t.interceptor.TransactionAspectSupport
  import o.s.t.support.TransactionSynchronizationManager

  for (sc in grailsApplication.serviceClasses) {
     def metaClass = sc.clazz.metaClass

     …
  }




                           CONFIDENTIAL                    24
Utility Methods




  // returns TransactionStatus
  metaClass.getCurrentTransactionStatus = { ­>
     if (!delegate.isTransactionActive()) {
         return null
     }
     TransactionAspectSupport.currentTransactionStatus()
  }




                           CONFIDENTIAL                    25
Utility Methods




  // void, throws NoTransactionException
  metaClass.setRollbackOnly = { ­>
     TransactionAspectSupport.currentTransactionStatus()
           .setRollbackOnly()
  }




                           CONFIDENTIAL                    26
Utility Methods




  // returns boolean
  metaClass.isRollbackOnly = { ­>
     if (!delegate.isTransactionActive()) {
         return false
     }
     delegate.getCurrentTransactionStatus().isRollbackOnly()
  }




                           CONFIDENTIAL                        27
Utility Methods




  // returns boolean
  metaClass.isTransactionActive = { ­>
     TransactionSynchronizationManager
           .isSynchronizationActive()
  }




                           CONFIDENTIAL   28
Dependency Injection




        CONFIDENTIAL   29
Inversion of Control and Dependency Injection


  def userService




                             CONFIDENTIAL       30
Inversion of Control and Dependency Injection


  def userService




  private Object userService

  void setUserService(Object userService) {
     this.userService = userService
  }

  Object getUserService() {
     return userService
  }




                               CONFIDENTIAL     31
Complex dependency 
configuration using Spring 
           SpEL


           CONFIDENTIAL       32
Complex dependency configuration using Spring SpEL




       beans = {
          bar(Bar)

          foo(Foo) {
             name = '#{bar.name}'
          }
       }




                           CONFIDENTIAL              33
Complex dependency configuration using Spring SpEL




       beans = {
          bar(Bar)

          foo(Foo) {
             name = '#{bar.resourceName()}'
          }
       }




                           CONFIDENTIAL              34
Manually injecting 
dependencies at runtime




          CONFIDENTIAL    35
Manually injecting dependencies at runtime


  import org.springframework.beans.factory.config.AutowireCapableBeanFactory

  ...

  def grailsApplication

  ...

  def instance = new XXX(...)

  def ctx = grailsApplication.mainContext
  ctx.beanFactory.autowireBeanProperties(
     instance,
     AutowireCapableBeanFactory.AUTOWIRE_BY_NAME,
     false)




                                   CONFIDENTIAL                                36
Bean Scopes




    CONFIDENTIAL   37
Bean Scopes

 By default Spring beans are singletons




                             CONFIDENTIAL   38
Bean Scopes


 Other scopes

 • prototype

 • session

 • request




                 CONFIDENTIAL   39
Bean Scopes


 You can even create your own custom scope:

 • implement 

  org.springframework.beans.factory.config.Scope

 • register: ctx.beanFactory.registerScope 

  'myScope', new MyScope()




                            CONFIDENTIAL           40
Bean lifecycles and interfaces




             CONFIDENTIAL        41
Bean lifecycles and interfaces

 Set the initMethod and/or the destroyMethod names 
 when registering beans


 import com.mycompany.myapp.LdapAuthenticationManager

 ...

 authenticationManager(LdapAuthenticationManager) { bean ­>
    serverUrl = '...'
    password = '...'
    bean.initMethod = 'init'
    bean.destroyMethod = 'destroy'
 }




                                 CONFIDENTIAL                 42
Bean lifecycles and interfaces

 Implement the
 org.springframework.beans.factory.InitializingBean

 interface and its afterPropertiesSet method and/or the
 org.springframework.beans.factory.DisposableBean
 interface and its destroy method




                                 CONFIDENTIAL             43
Bean lifecycles and interfaces


 package com.mycompany.myapp

 import org.springframework.beans.factory.DisposableBean
 import org.springframework.beans.factory.InitializingBean

 class LdapAuthenticationManager implements 
 InitializingBean, DisposableBean {

    ...

    void afterPropertiesSet() {
       // initialization work
    }

    void destroy() {
       // shutdown work
    }
 }

                                 CONFIDENTIAL                44
Bean PostProcessors




        CONFIDENTIAL   45
Bean PostProcessors


 o.s.b.factory.config.BeanPostProcessor
 • Object postProcessBeforeInitialization(Object bean, 

  String beanName)

 • Object postProcessAfterInitialization(Object bean, 

  String beanName)




                           CONFIDENTIAL                   46
Bean PostProcessors


 o.s.b.factory.config.BeanFactoryPostProcessor
 • void postProcessBeanFactory(ConfigurableListableBeanFactory 

  beanFactory)




                            CONFIDENTIAL                     47
Bean PostProcessors


 o.s.b.factory.support.BeanDefinitionRegistryPostProcessor
 • extends BeanFactoryPostProcessor

 • void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry 

  registry)




                               CONFIDENTIAL                         48
Cloud Support Plugin (cloud­foundry, heroku)




   dataSourceBean.driverClassName = 
   updatedValues.driverClassName

   dataSourceBean.url = updatedValues.url + suffix

   dataSourceBean.username = updatedValues.userName

   dataSourceBean.password = updatedValues.password




                             CONFIDENTIAL             49
Alternate approach to BeanDefinition modification



  def doWithSpring = {

     def mybeanDef = delegate.getBeanDefinition('mybean')

     mybeanDef.beanClass = NewClass

     mybeanDef.propertyValues.add("order",
           application.config.plugin?.rendering?.order ?: 42)
  }



  ●   Use loadAfter = ['plugin1', 'plugin2'] to
  ensure the bean is loaded
  ●   Only valid in a plugin, not the app's resources.groovy

                               CONFIDENTIAL                    50
Bean Aliases




   CONFIDENTIAL   51
Aliases


 As of Grails 2.1 aliases work fully

 • You can create aliases pre­2.1 but only if defined in the same 

  resources.groovy or plugin (doWithSpring)


   beans = {
      springConfig.addAlias 'alias', 'realBean'
   }




                              CONFIDENTIAL                       52
Aliases


 The cache plugin registers the alias cacheOperationSource for 

 the bean registered as 
 org.springframework.cache.annotation.AnnotationCacheOperationSource#0



 Can use to have multiple implementations of a bean and choose 

 one via configuration at startup, e.g. per­environment or some 

 other rule




                                 CONFIDENTIAL                            53
Aliases

 import grails.util.Environment

 beans = {

    String realBeanName

    switch (Environment.current) {

       case Environment.TEST:
          realBeanName = 'testCardProcessingService'; break

       case Environment.PRODUCTION:
          realBeanName = 'productionCardProcessingService'; break

       default: // Environment.DEVELOPMENT, custom envs
          realBeanName = 'mockCardProcessingService'; break
    }

    springConfig.addAlias 'cardProcessingService', realBeanName
 }


                                  CONFIDENTIAL                      54
Internationalization




       CONFIDENTIAL    55
Internationalization


 First­class support in Grails via .properties files in grails­app/i18n

 All generated controllers, GSPs, and layouts are fully 

  internationalized with no hard­coded strings

 Domain class validation errors are internationalized the same way

 Enabled under the hood by the messageSource bean 

  (org.springframework.context.MessageSource)



                                  CONFIDENTIAL                             56
Internationalization


 Use the <g:message> tag in GSPs, message method in 

 controllers

 Or use dependency injection like with any Spring bean

 • def messageSource




                               CONFIDENTIAL               57
Spring MVC Controllers




         CONFIDENTIAL    58
Spring MVC


 New in Grails 1.2

 Annotate src/java or src/groovy classes with @Controller

 Add all packages to the grails.spring.bean.packages list in

 Config.groovy

 • e.g.grails.spring.bean.packages = ['gr8conf.testapp.foo']




                            CONFIDENTIAL                        59
Spring MVC


 Annotate methods with
 @o.s.w.bind.annotation.RequestMapping



   @RequestMapping("/mvc/hello.dispatch")
   public ModelMap handleRequest() {
      return new ModelMap()
         .addAttribute("text", "some text")
         .addAttribute("cost", 42)
         .addAttribute("config",
             grailsApplication.getConfig().flatten()));
   }




                          CONFIDENTIAL                    60
Spring MVC


 @RequestMapping URI value must end in .dispatch
 Add entries in UrlMappings to create more natural URLs

   class UrlMappings {

      static mappings = {
         …

         "/mvc/hello"(uri:"/mvc/hello.dispatch")

         "/mvc/other"(uri:"/mvc/other.dispatch")
      }
   }



                              CONFIDENTIAL                 61
Spring MVC


 Use @Autowired for dependency injection (on fields in Groovy 
 classes, on setters or constructors in Java)


   private GrailsApplication grailsApplication;

   @Autowired
   public void setGrailsApplication(GrailsApplication app) {
      grailsApplication = app;
   }




                                 CONFIDENTIAL                     62
Hibernate Integration




        CONFIDENTIAL    63
Hibernate Integration

 org.springframework.orm.hibernate3. 

 LocalSessionFactoryBean factory bean configures 

 org.hibernate.SessionFactory instances




                           CONFIDENTIAL             64
Hibernate Integration

 org.springframework.orm.hibernate3. 

 HibernateTransactionManager implements 

 org.springframework.transaction. 

 PlatformTransactionManager to abstract away the details of 

 transaction management




                           CONFIDENTIAL                        65
Thread­local holders


 Cumbersome to explicitly open a Hibernate Session or start a

 transaction and have to pass one or more related objects from

 method to method




                              CONFIDENTIAL                       66
Thread­local holders


 Spring uses ThreadLocal scope since web requests are handled

 per-thread




                            CONFIDENTIAL                     67
Thread­local holders


 See org.springframework.transaction.support. 

 TransactionSynchronizationManager and

 org.springframework.orm.hibernate3. 

 SessionFactoryUtils helper classes




                         CONFIDENTIAL             68
Thread­local holders


 Further helped by

 org.codehaus.groovy.grails.orm.hibernate.support. 

 GrailsOpenSessionInViewInterceptor




                       CONFIDENTIAL               69
Thread­local holders


 Opens a Hibernate Session at the start of all controller requests

 and registers it in thread-local scope

 For the duration of the request, there is always an active session

 After the request it flushes and closes the Session




                                CONFIDENTIAL                           70
Thread­local holders


 Hibernate implementation of GORM uses a

 org.springframework.orm.hibernate3. 

 HibernateTemplate under the hood to execute most queries




                             CONFIDENTIAL                   71
Thread­local holders


 HibernateTemplate uses SessionFactoryUtils.getSession() to

 find or create a Session




                            CONFIDENTIAL                   72
Thread­local holders


 Plugins that enable asynchronous processing (Quartz, Gpars,

 Executor) all implement patterns similar to OpenSessionInView




                              CONFIDENTIAL                       73
Other Cool Stuff




      CONFIDENTIAL   74
Other Cool Stuff


 Standard and Custom Events

 Resources

 Data Binding and Validation

 Marshalling XML using O/X Mappers

 JMS (see Grails jms and ActiveMQ plugins)

 EJBs


                                CONFIDENTIAL   75
Other Cool Stuff


 Remoting (see the Grails remoting plugin)
  • Remote Method Invocation (RMI)
  • Hessian (Caucho's lightweight binary HTTP­based protocol)
  • Burlap (another protocol from Caucho which uses XML)
  • Spring's HTTP invoker

 JMX (see the Grails jmx plugin)

 Email (see the Grails mail plugin)




                                CONFIDENTIAL                    76
Other Cool Stuff

 Other persistence support

 • HibernateTemplate

 • JdbcTemplate

 • Other database support

   • JDO

   • JPA

   • iBATIS (2.x) SQL Maps

                              CONFIDENTIAL   77
Want More Information?




         CONFIDENTIAL    78
Thank You




  CONFIDENTIAL   80

More Related Content

What's hot

Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発
Recruit Lifestyle Co., Ltd.
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring Session
David Gómez García
 
Making React Native UI Components with Swift
Making React Native UI Components with SwiftMaking React Native UI Components with Swift
Making React Native UI Components with Swift
Ray Deck
 
Practical Protocol-Oriented-Programming
Practical Protocol-Oriented-ProgrammingPractical Protocol-Oriented-Programming
Practical Protocol-Oriented-Programming
Natasha Murashev
 
My way to clean android v2 English DroidCon Spain
My way to clean android v2 English DroidCon SpainMy way to clean android v2 English DroidCon Spain
My way to clean android v2 English DroidCon Spain
Christian Panadero
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency Injection
Stfalcon Meetups
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency Injections
GlobalLogic Ukraine
 
React lecture
React lectureReact lecture
React lecture
Christoffer Noring
 
My way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca editionMy way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca edition
Christian Panadero
 
Open sourcing the store
Open sourcing the storeOpen sourcing the store
Open sourcing the store
Mike Nakhimovich
 
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
GreeceJS
 
Android development
Android developmentAndroid development
Android development
Gregoire BARRET
 
Making the Most of Your Gradle Build
Making the Most of Your Gradle BuildMaking the Most of Your Gradle Build
Making the Most of Your Gradle Build
Andres Almiray
 
Dependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutesDependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutes
Antonio Goncalves
 
guice-servlet
guice-servletguice-servlet
guice-servlet
Masaaki Yonebayashi
 
Java8 tgtbatu javaone
Java8 tgtbatu javaoneJava8 tgtbatu javaone
Java8 tgtbatu javaone
Brian Vermeer
 
Redux for ReactJS Programmers
Redux for ReactJS ProgrammersRedux for ReactJS Programmers
Redux for ReactJS Programmers
David Rodenas
 
Redux vs Alt
Redux vs AltRedux vs Alt
Redux vs Alt
Uldis Sturms
 

What's hot (19)

Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring Session
 
Making React Native UI Components with Swift
Making React Native UI Components with SwiftMaking React Native UI Components with Swift
Making React Native UI Components with Swift
 
Practical Protocol-Oriented-Programming
Practical Protocol-Oriented-ProgrammingPractical Protocol-Oriented-Programming
Practical Protocol-Oriented-Programming
 
My way to clean android v2 English DroidCon Spain
My way to clean android v2 English DroidCon SpainMy way to clean android v2 English DroidCon Spain
My way to clean android v2 English DroidCon Spain
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency Injection
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency Injections
 
React lecture
React lectureReact lecture
React lecture
 
My way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca editionMy way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca edition
 
Open sourcing the store
Open sourcing the storeOpen sourcing the store
Open sourcing the store
 
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
An Emoji Introduction to React Native (Panagiotis Vourtsis, Senior Front End ...
 
Android development
Android developmentAndroid development
Android development
 
Making the Most of Your Gradle Build
Making the Most of Your Gradle BuildMaking the Most of Your Gradle Build
Making the Most of Your Gradle Build
 
Dependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutesDependency Injection with CDI in 15 minutes
Dependency Injection with CDI in 15 minutes
 
guice-servlet
guice-servletguice-servlet
guice-servlet
 
Java8 tgtbatu javaone
Java8 tgtbatu javaoneJava8 tgtbatu javaone
Java8 tgtbatu javaone
 
droidparts
droidpartsdroidparts
droidparts
 
Redux for ReactJS Programmers
Redux for ReactJS ProgrammersRedux for ReactJS Programmers
Redux for ReactJS Programmers
 
Redux vs Alt
Redux vs AltRedux vs Alt
Redux vs Alt
 

Similar to Under the Hood: Using Spring in Grails

Spring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenSpring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in Heaven
Joshua Long
 
GR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf
 
Serverless Angular, Material, Firebase and Google Cloud applications
Serverless Angular, Material, Firebase and Google Cloud applicationsServerless Angular, Material, Firebase and Google Cloud applications
Serverless Angular, Material, Firebase and Google Cloud applications
Loiane Groner
 
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
Daniel Bryant
 
Integration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDBIntegration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDB
Michal Bigos
 
Provisioning & Migration with p2: Case study - The Good, the Bad and the Ugly
Provisioning & Migration with p2: Case study - The Good, the Bad and the UglyProvisioning & Migration with p2: Case study - The Good, the Bad and the Ugly
Provisioning & Migration with p2: Case study - The Good, the Bad and the Ugly
christianbourgeois
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App Engine
IndicThreads
 
Testing your application on Google App Engine
Testing your application on Google App EngineTesting your application on Google App Engine
Testing your application on Google App Engine
Inphina Technologies
 
Practialpop 160510130818
Practialpop 160510130818Practialpop 160510130818
Practialpop 160510130818
Shahzain Saeed
 
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in SwiftMCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
PROIDEA
 
Testing the Grails Spring Security Plugins
Testing the Grails Spring Security PluginsTesting the Grails Spring Security Plugins
Testing the Grails Spring Security Plugins
Burt Beckwith
 
Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02
rhemsolutions
 
Hacking the Grails Spring Security Plugins
Hacking the Grails Spring Security PluginsHacking the Grails Spring Security Plugins
Hacking the Grails Spring Security PluginsGR8Conf
 
Java Configuration Deep Dive with Spring
Java Configuration Deep Dive with SpringJava Configuration Deep Dive with Spring
Java Configuration Deep Dive with Spring
Joshua Long
 
Whirlwind tour of Activiti 7 by Ryan Dawson
Whirlwind tour of Activiti 7 by Ryan DawsonWhirlwind tour of Activiti 7 by Ryan Dawson
Whirlwind tour of Activiti 7 by Ryan Dawson
Mauricio (Salaboy) Salatino
 
Whirlwind tour of activiti 7
Whirlwind tour of activiti 7Whirlwind tour of activiti 7
Whirlwind tour of activiti 7
Ryan Dawson
 
Spring mvc my Faviourite Slide
Spring mvc my Faviourite SlideSpring mvc my Faviourite Slide
Spring mvc my Faviourite SlideDaniel Adenew
 
Multi Client Development with Spring
Multi Client Development with SpringMulti Client Development with Spring
Multi Client Development with Spring
Joshua Long
 

Similar to Under the Hood: Using Spring in Grails (20)

Spring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenSpring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in Heaven
 
GR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug in
 
Serverless Angular, Material, Firebase and Google Cloud applications
Serverless Angular, Material, Firebase and Google Cloud applicationsServerless Angular, Material, Firebase and Google Cloud applications
Serverless Angular, Material, Firebase and Google Cloud applications
 
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
 
Integration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDBIntegration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDB
 
Provisioning & Migration with p2: Case study - The Good, the Bad and the Ugly
Provisioning & Migration with p2: Case study - The Good, the Bad and the UglyProvisioning & Migration with p2: Case study - The Good, the Bad and the Ugly
Provisioning & Migration with p2: Case study - The Good, the Bad and the Ugly
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App Engine
 
Testing your application on Google App Engine
Testing your application on Google App EngineTesting your application on Google App Engine
Testing your application on Google App Engine
 
Practialpop 160510130818
Practialpop 160510130818Practialpop 160510130818
Practialpop 160510130818
 
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in SwiftMCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
MCE^3 - Natasha Murashev - Practical Protocol-Oriented Programming in Swift
 
Devoxx 2012 (v2)
Devoxx 2012 (v2)Devoxx 2012 (v2)
Devoxx 2012 (v2)
 
Android workshop
Android workshopAndroid workshop
Android workshop
 
Testing the Grails Spring Security Plugins
Testing the Grails Spring Security PluginsTesting the Grails Spring Security Plugins
Testing the Grails Spring Security Plugins
 
Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02Architecting your GWT applications with GWT-Platform - Lesson 02
Architecting your GWT applications with GWT-Platform - Lesson 02
 
Hacking the Grails Spring Security Plugins
Hacking the Grails Spring Security PluginsHacking the Grails Spring Security Plugins
Hacking the Grails Spring Security Plugins
 
Java Configuration Deep Dive with Spring
Java Configuration Deep Dive with SpringJava Configuration Deep Dive with Spring
Java Configuration Deep Dive with Spring
 
Whirlwind tour of Activiti 7 by Ryan Dawson
Whirlwind tour of Activiti 7 by Ryan DawsonWhirlwind tour of Activiti 7 by Ryan Dawson
Whirlwind tour of Activiti 7 by Ryan Dawson
 
Whirlwind tour of activiti 7
Whirlwind tour of activiti 7Whirlwind tour of activiti 7
Whirlwind tour of activiti 7
 
Spring mvc my Faviourite Slide
Spring mvc my Faviourite SlideSpring mvc my Faviourite Slide
Spring mvc my Faviourite Slide
 
Multi Client Development with Spring
Multi Client Development with SpringMulti Client Development with Spring
Multi Client Development with Spring
 

More from Burt Beckwith

Advanced GORM - Performance, Customization and Monitoring
Advanced GORM - Performance, Customization and MonitoringAdvanced GORM - Performance, Customization and Monitoring
Advanced GORM - Performance, Customization and Monitoring
Burt Beckwith
 
Fun With Spring Security
Fun With Spring SecurityFun With Spring Security
Fun With Spring Security
Burt Beckwith
 
Little Did He Know ...
Little Did He Know ...Little Did He Know ...
Little Did He Know ...
Burt Beckwith
 
Hacking the Grails Spring Security 2.0 Plugin
Hacking the Grails Spring Security 2.0 PluginHacking the Grails Spring Security 2.0 Plugin
Hacking the Grails Spring Security 2.0 Plugin
Burt Beckwith
 
What's New in spring-security-core 2.0
What's New in spring-security-core 2.0What's New in spring-security-core 2.0
What's New in spring-security-core 2.0
Burt Beckwith
 
Grails Worst Practices
Grails Worst PracticesGrails Worst Practices
Grails Worst Practices
Burt Beckwith
 
Grails Transactions
Grails TransactionsGrails Transactions
Grails Transactions
Burt Beckwith
 
Grails Plugin Best Practices
Grails Plugin Best PracticesGrails Plugin Best Practices
Grails Plugin Best Practices
Burt Beckwith
 
Securing Grails Applications
Securing Grails ApplicationsSecuring Grails Applications
Securing Grails Applications
Burt Beckwith
 

More from Burt Beckwith (9)

Advanced GORM - Performance, Customization and Monitoring
Advanced GORM - Performance, Customization and MonitoringAdvanced GORM - Performance, Customization and Monitoring
Advanced GORM - Performance, Customization and Monitoring
 
Fun With Spring Security
Fun With Spring SecurityFun With Spring Security
Fun With Spring Security
 
Little Did He Know ...
Little Did He Know ...Little Did He Know ...
Little Did He Know ...
 
Hacking the Grails Spring Security 2.0 Plugin
Hacking the Grails Spring Security 2.0 PluginHacking the Grails Spring Security 2.0 Plugin
Hacking the Grails Spring Security 2.0 Plugin
 
What's New in spring-security-core 2.0
What's New in spring-security-core 2.0What's New in spring-security-core 2.0
What's New in spring-security-core 2.0
 
Grails Worst Practices
Grails Worst PracticesGrails Worst Practices
Grails Worst Practices
 
Grails Transactions
Grails TransactionsGrails Transactions
Grails Transactions
 
Grails Plugin Best Practices
Grails Plugin Best PracticesGrails Plugin Best Practices
Grails Plugin Best Practices
 
Securing Grails Applications
Securing Grails ApplicationsSecuring Grails Applications
Securing Grails Applications
 

Recently uploaded

Gabriel Kalembo A Rising Star in the World of Football Coaching
Gabriel Kalembo A Rising Star in the World of Football CoachingGabriel Kalembo A Rising Star in the World of Football Coaching
Gabriel Kalembo A Rising Star in the World of Football Coaching
gabrielkalembous
 
CAA Region II Day 1 Morning Result Accra event
CAA Region II Day 1 Morning Result Accra eventCAA Region II Day 1 Morning Result Accra event
CAA Region II Day 1 Morning Result Accra event
Kweku Zurek
 
The Split_ Hardik Pandya and Natasa Stankovic Part Ways News by Betkaro247 (3...
The Split_ Hardik Pandya and Natasa Stankovic Part Ways News by Betkaro247 (3...The Split_ Hardik Pandya and Natasa Stankovic Part Ways News by Betkaro247 (3...
The Split_ Hardik Pandya and Natasa Stankovic Part Ways News by Betkaro247 (3...
bet k247
 
Croatia vs Italy Can Luka Modrić Lead Croatia to Euro Cup Germany Glory in Hi...
Croatia vs Italy Can Luka Modrić Lead Croatia to Euro Cup Germany Glory in Hi...Croatia vs Italy Can Luka Modrić Lead Croatia to Euro Cup Germany Glory in Hi...
Croatia vs Italy Can Luka Modrić Lead Croatia to Euro Cup Germany Glory in Hi...
Eticketing.co
 
MESH IPL 2024 REport_Wavemaker India.pdf
MESH IPL 2024 REport_Wavemaker India.pdfMESH IPL 2024 REport_Wavemaker India.pdf
MESH IPL 2024 REport_Wavemaker India.pdf
Social Samosa
 
TAM Sports_IPL 17_Commercial Advertising_Report.pdf
TAM Sports_IPL 17_Commercial Advertising_Report.pdfTAM Sports_IPL 17_Commercial Advertising_Report.pdf
TAM Sports_IPL 17_Commercial Advertising_Report.pdf
Social Samosa
 
Turkey vs Georgia Tickets: Turkey's Road to Glory and Building Momentum for U...
Turkey vs Georgia Tickets: Turkey's Road to Glory and Building Momentum for U...Turkey vs Georgia Tickets: Turkey's Road to Glory and Building Momentum for U...
Turkey vs Georgia Tickets: Turkey's Road to Glory and Building Momentum for U...
Eticketing.co
 
European Championships Football Quiz.pptx
European Championships Football Quiz.pptxEuropean Championships Football Quiz.pptx
European Championships Football Quiz.pptx
PaulGray854697
 
Ukraine Euro Cup 2024 Squad Sergiy Rebrov's Selections and Prospects.docx
Ukraine Euro Cup 2024 Squad Sergiy Rebrov's Selections and Prospects.docxUkraine Euro Cup 2024 Squad Sergiy Rebrov's Selections and Prospects.docx
Ukraine Euro Cup 2024 Squad Sergiy Rebrov's Selections and Prospects.docx
Euro Cup 2024 Tickets
 
My Personal Brand Key Note presentation.
My Personal Brand  Key Note presentation.My Personal Brand  Key Note presentation.
My Personal Brand Key Note presentation.
ashleymlugaro
 
真实可查(uofo毕业证书)俄勒冈大学毕业证学位证书范本原版一模一样
真实可查(uofo毕业证书)俄勒冈大学毕业证学位证书范本原版一模一样真实可查(uofo毕业证书)俄勒冈大学毕业证学位证书范本原版一模一样
真实可查(uofo毕业证书)俄勒冈大学毕业证学位证书范本原版一模一样
ra9gairo
 
Belgium vs Romania Injuries and Patience in Belgium’s Euro Cup Germany Squad....
Belgium vs Romania Injuries and Patience in Belgium’s Euro Cup Germany Squad....Belgium vs Romania Injuries and Patience in Belgium’s Euro Cup Germany Squad....
Belgium vs Romania Injuries and Patience in Belgium’s Euro Cup Germany Squad....
Eticketing.co
 
Turkey vs Georgia Turkey's Road to Redemption and Euro 2024 Prospects.pdf
Turkey vs Georgia Turkey's Road to Redemption and Euro 2024 Prospects.pdfTurkey vs Georgia Turkey's Road to Redemption and Euro 2024 Prospects.pdf
Turkey vs Georgia Turkey's Road to Redemption and Euro 2024 Prospects.pdf
Eticketing.co
 
Switzerland vs Germany At UEFA Euro 2024 the Full squad, preview, match sched...
Switzerland vs Germany At UEFA Euro 2024 the Full squad, preview, match sched...Switzerland vs Germany At UEFA Euro 2024 the Full squad, preview, match sched...
Switzerland vs Germany At UEFA Euro 2024 the Full squad, preview, match sched...
Eticketing.co
 
Turkey Hit by Double Injury Blow before of Euro 2024.docx
Turkey Hit by Double Injury Blow before of Euro 2024.docxTurkey Hit by Double Injury Blow before of Euro 2024.docx
Turkey Hit by Double Injury Blow before of Euro 2024.docx
Euro Cup 2024 Tickets
 
Narrated Business Proposal for the Philadelphia Eagles
Narrated Business Proposal for the Philadelphia EaglesNarrated Business Proposal for the Philadelphia Eagles
Narrated Business Proposal for the Philadelphia Eagles
camrynascott12
 
Spain vs Italy Spain at Euro Cup 2024 Group, Fixtures, Players to Watch and M...
Spain vs Italy Spain at Euro Cup 2024 Group, Fixtures, Players to Watch and M...Spain vs Italy Spain at Euro Cup 2024 Group, Fixtures, Players to Watch and M...
Spain vs Italy Spain at Euro Cup 2024 Group, Fixtures, Players to Watch and M...
Eticketing.co
 
Boletin de la I Copa Panamericana de Voleibol Femenino U17 Guatemala 2024
Boletin de la I Copa Panamericana de Voleibol Femenino U17 Guatemala 2024Boletin de la I Copa Panamericana de Voleibol Femenino U17 Guatemala 2024
Boletin de la I Copa Panamericana de Voleibol Femenino U17 Guatemala 2024
Judith Chuquipul
 
JORNADA 10 LIGA MURO 2024BASQUETBOL1.pdf
JORNADA 10 LIGA MURO 2024BASQUETBOL1.pdfJORNADA 10 LIGA MURO 2024BASQUETBOL1.pdf
JORNADA 10 LIGA MURO 2024BASQUETBOL1.pdf
Arturo Pacheco Alvarez
 
Understanding Golf Simulator Equipment A Beginner's Guide.pdf
Understanding Golf Simulator Equipment A Beginner's Guide.pdfUnderstanding Golf Simulator Equipment A Beginner's Guide.pdf
Understanding Golf Simulator Equipment A Beginner's Guide.pdf
My Garage Golf
 

Recently uploaded (20)

Gabriel Kalembo A Rising Star in the World of Football Coaching
Gabriel Kalembo A Rising Star in the World of Football CoachingGabriel Kalembo A Rising Star in the World of Football Coaching
Gabriel Kalembo A Rising Star in the World of Football Coaching
 
CAA Region II Day 1 Morning Result Accra event
CAA Region II Day 1 Morning Result Accra eventCAA Region II Day 1 Morning Result Accra event
CAA Region II Day 1 Morning Result Accra event
 
The Split_ Hardik Pandya and Natasa Stankovic Part Ways News by Betkaro247 (3...
The Split_ Hardik Pandya and Natasa Stankovic Part Ways News by Betkaro247 (3...The Split_ Hardik Pandya and Natasa Stankovic Part Ways News by Betkaro247 (3...
The Split_ Hardik Pandya and Natasa Stankovic Part Ways News by Betkaro247 (3...
 
Croatia vs Italy Can Luka Modrić Lead Croatia to Euro Cup Germany Glory in Hi...
Croatia vs Italy Can Luka Modrić Lead Croatia to Euro Cup Germany Glory in Hi...Croatia vs Italy Can Luka Modrić Lead Croatia to Euro Cup Germany Glory in Hi...
Croatia vs Italy Can Luka Modrić Lead Croatia to Euro Cup Germany Glory in Hi...
 
MESH IPL 2024 REport_Wavemaker India.pdf
MESH IPL 2024 REport_Wavemaker India.pdfMESH IPL 2024 REport_Wavemaker India.pdf
MESH IPL 2024 REport_Wavemaker India.pdf
 
TAM Sports_IPL 17_Commercial Advertising_Report.pdf
TAM Sports_IPL 17_Commercial Advertising_Report.pdfTAM Sports_IPL 17_Commercial Advertising_Report.pdf
TAM Sports_IPL 17_Commercial Advertising_Report.pdf
 
Turkey vs Georgia Tickets: Turkey's Road to Glory and Building Momentum for U...
Turkey vs Georgia Tickets: Turkey's Road to Glory and Building Momentum for U...Turkey vs Georgia Tickets: Turkey's Road to Glory and Building Momentum for U...
Turkey vs Georgia Tickets: Turkey's Road to Glory and Building Momentum for U...
 
European Championships Football Quiz.pptx
European Championships Football Quiz.pptxEuropean Championships Football Quiz.pptx
European Championships Football Quiz.pptx
 
Ukraine Euro Cup 2024 Squad Sergiy Rebrov's Selections and Prospects.docx
Ukraine Euro Cup 2024 Squad Sergiy Rebrov's Selections and Prospects.docxUkraine Euro Cup 2024 Squad Sergiy Rebrov's Selections and Prospects.docx
Ukraine Euro Cup 2024 Squad Sergiy Rebrov's Selections and Prospects.docx
 
My Personal Brand Key Note presentation.
My Personal Brand  Key Note presentation.My Personal Brand  Key Note presentation.
My Personal Brand Key Note presentation.
 
真实可查(uofo毕业证书)俄勒冈大学毕业证学位证书范本原版一模一样
真实可查(uofo毕业证书)俄勒冈大学毕业证学位证书范本原版一模一样真实可查(uofo毕业证书)俄勒冈大学毕业证学位证书范本原版一模一样
真实可查(uofo毕业证书)俄勒冈大学毕业证学位证书范本原版一模一样
 
Belgium vs Romania Injuries and Patience in Belgium’s Euro Cup Germany Squad....
Belgium vs Romania Injuries and Patience in Belgium’s Euro Cup Germany Squad....Belgium vs Romania Injuries and Patience in Belgium’s Euro Cup Germany Squad....
Belgium vs Romania Injuries and Patience in Belgium’s Euro Cup Germany Squad....
 
Turkey vs Georgia Turkey's Road to Redemption and Euro 2024 Prospects.pdf
Turkey vs Georgia Turkey's Road to Redemption and Euro 2024 Prospects.pdfTurkey vs Georgia Turkey's Road to Redemption and Euro 2024 Prospects.pdf
Turkey vs Georgia Turkey's Road to Redemption and Euro 2024 Prospects.pdf
 
Switzerland vs Germany At UEFA Euro 2024 the Full squad, preview, match sched...
Switzerland vs Germany At UEFA Euro 2024 the Full squad, preview, match sched...Switzerland vs Germany At UEFA Euro 2024 the Full squad, preview, match sched...
Switzerland vs Germany At UEFA Euro 2024 the Full squad, preview, match sched...
 
Turkey Hit by Double Injury Blow before of Euro 2024.docx
Turkey Hit by Double Injury Blow before of Euro 2024.docxTurkey Hit by Double Injury Blow before of Euro 2024.docx
Turkey Hit by Double Injury Blow before of Euro 2024.docx
 
Narrated Business Proposal for the Philadelphia Eagles
Narrated Business Proposal for the Philadelphia EaglesNarrated Business Proposal for the Philadelphia Eagles
Narrated Business Proposal for the Philadelphia Eagles
 
Spain vs Italy Spain at Euro Cup 2024 Group, Fixtures, Players to Watch and M...
Spain vs Italy Spain at Euro Cup 2024 Group, Fixtures, Players to Watch and M...Spain vs Italy Spain at Euro Cup 2024 Group, Fixtures, Players to Watch and M...
Spain vs Italy Spain at Euro Cup 2024 Group, Fixtures, Players to Watch and M...
 
Boletin de la I Copa Panamericana de Voleibol Femenino U17 Guatemala 2024
Boletin de la I Copa Panamericana de Voleibol Femenino U17 Guatemala 2024Boletin de la I Copa Panamericana de Voleibol Femenino U17 Guatemala 2024
Boletin de la I Copa Panamericana de Voleibol Femenino U17 Guatemala 2024
 
JORNADA 10 LIGA MURO 2024BASQUETBOL1.pdf
JORNADA 10 LIGA MURO 2024BASQUETBOL1.pdfJORNADA 10 LIGA MURO 2024BASQUETBOL1.pdf
JORNADA 10 LIGA MURO 2024BASQUETBOL1.pdf
 
Understanding Golf Simulator Equipment A Beginner's Guide.pdf
Understanding Golf Simulator Equipment A Beginner's Guide.pdfUnderstanding Golf Simulator Equipment A Beginner's Guide.pdf
Understanding Golf Simulator Equipment A Beginner's Guide.pdf
 

Under the Hood: Using Spring in Grails