Spring 4: Groovy DSL bean definition

Spring 4: Groovy DSL bean definition

In Spring 2.x, script language is supported in Spring via the Java scripting engine.

In Spring 4.0, Groovy is a first class citizen in Spring. Groovy can be used as an alternative for bean definition.

Groovy DSL bean definition

As a Spring developer, you could be very familiar with XML and annotation for bean definition.

An example of XML bean definition.

 


 

 



 

 
    
 
  
 
  
    
 
  
 
  
    
 
  
 
  
    
 
  
 
   
    
    
      com.hantsylabs.example.spring.model 
     
    
  
    
 
  
 
   
   
     hibernate.format_sql=true hibernate.show_sql=true hibernate.hbm2ddl.auto=create 
    
  


 

 



 

 
    
 
  
 
  


 

 

The following is the equivalent bean definition based on Java annotation.

@Configuration
@ComponentScan(basePackages = { "com.hantsylabs.example.spring.dao",
        "com.hantsylabs.example.spring.jpa" })
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
public class JpaConfig {

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(dataSource());
        emf.setPackagesToScan("com.hantsylabs.example.spring.model");
        emf.setPersistenceProvider(new HibernatePersistence());
        emf.setJpaProperties(jpaProperties());
        return emf;
    }

    private Properties jpaProperties() {
        Properties extraProperties = new Properties();
        extraProperties.put("hibernate.format_sql", "true");
        extraProperties.put("hibernate.show_sql", "true");
        extraProperties.put("hibernate.hbm2ddl.auto", "create");
        return extraProperties;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory().getObject());
    }

}

The following context defines these beans in a Groovy file.

import org.apache.commons.dbcp.BasicDataSource
import org.springframework.orm.jpa.JpaTransactionManager
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
import com.hantsylabs.example.spring.jpa.JpaConferenceDaoImpl

beans {
     dataSource(BasicDataSource) {       
         driverClassName = "org.h2.Driver"
         url = "jdbc:h2:mem:spring4-sandbox"
         username = "sa"
         password = ""
     }

     entityManagerFactory(LocalContainerEntityManagerFactoryBean){
         persistenceProviderClass="org.hibernate.ejb.HibernatePersistence"
         dataSource=dataSource
         persistenceUnitName="persistenceUnit"
         packagesToScan=["com.hantsylabs.example.spring.model"]
         jpaProperties=[
             "hibernate.format_sql":"true",
             "hibernate.show_sql":"true",
             "hibernate.hbm2ddl.auto":"create"
             ]
     }

     transactionManager(JpaTransactionManager){
         entityManagerFactory=entityManagerFactory
     }

     conferenceDao(JpaConferenceDaoImpl){
     }

 }

If you have some experience of Grails, you could have recognized this feature is really a copy of Grails resources.groovy.

Add groovy dependency in your pom.xml.

 
    
 
  
 
  
    org.codehaus.groovy 
  
    
 
  
 
  
    groovy-all 
  
    
 
  
 
  
    2.1.8 
  


 

 

Write some test codes.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "classpath:/com/hantsylabs/example/spring/config/JpaConfigGroovy.groovy", loader = GenericGroovyContextLoader.class)
@TransactionConfiguration
public class GroovyJpaConferenceDaoImplTest {

    public static class GenericGroovyContextLoader extends
            AbstractGenericContextLoader {

        @Override
        protected BeanDefinitionReader createBeanDefinitionReader(
                GenericApplicationContext context) {
            return new GroovyBeanDefinitionReader(context);
        }

        @Override
        protected String getResourceSuffix() {
            return ".groovy";
        }

    }

    // test codes
}

I've tried to load the Groovy bean definition resource through @ContextConfiguration annotation, but it does not work. By default, the locations and value are ready for loading XML bean definition. Spring 4.0 includes a GroovyBeanDefinitionReader for reading and parsing Groovy bean definition. It is easy to write a custom context loader for loading the Groovy bean definition.

The Conference, ConferenceDao, JpaConferneceDaoImpl, and the CRUD test cases are no difference from my before posts.

Create Spring Bean in Groovy way

Create a simple ConferenceService bean, but use Groovy, put it under src/main/groovy folder.

package com.hantsylabs.example.spring.service

import com.hantsylabs.example.spring.dao.ConferenceDao

class ConferenceService {

    def conferenceDao

    def findConferenceBySlug(String slug) {
        conferenceDao.findBySlug(slug)
    }

}

Declare it as a Spring bean.

conferenceService(ConferenceService){
    conferenceDao=conferenceDao
}

Test it.

package com.hantsylabs.example.spring.dao;

//other imports are omitted
import com.hantsylabs.example.spring.service.ConferenceService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "classpath:/com/hantsylabs/example/spring/config/JpaConfigGroovy.groovy", loader = GenericGroovyContextLoader.class)
@TransactionConfiguration
public class GroovyConferenceServiceTest {
    //all duplicated codes are omitted
    @Autowired
    ConferenceService conferenceService;

    @Test
    @Transactional
    public void retrieveConference() {
        //all duplicated codes are omitted
        // query by slug
        conference = (Conference) conferenceService.findConferenceBySlug("jud-2013");

        assertTrue(conference != null);
    }
}

Groovy files are put in src/main/groovy, you need to configure the java compiler to compile groovy files.

 
    
 
  
 
  
    maven-compiler-plugin 
  
    
 
  
 
  
    
 
  
 
  
    3.1 
  
    
 
  
 
   
   
     groovy-eclipse-compiler 
    
    
    
  
    
 
  
 
   
    
    
      org.codehaus.groovy 
     
    
      groovy-eclipse-compiler 
     
    
      2.8.0-01 
     
    
    
    
    
      org.codehaus.groovy 
     
    
      groovy-eclipse-batch 
     
    
      2.1.8-01 
     
     
     
     
    
  


 

 


 

 
    
 
  
 
  
    org.codehaus.mojo 
  
    
 
  
 
  
    build-helper-maven-plugin 
  
    
 
  
 
  
    1.5 
  
    
 
  
 
   
    
    
      add-source 
     
    
      generate-sources 
     
     
     
       add-source 
      
     
     
      
      src/main/groovy 
      
     
    
    
    
      add-test-source 
     
    
      generate-test-sources 
     
     
     
       add-test-source 
      
     
     
      
      src/test/groovy 
      
     
    
  


 

 

build-helper-maven-plugin plugin will add src/main/groovy as a compilation source folder, and compiler plugin with groovy-eclipse-compiler configuration will compile groovy into java classes.

If you are using Eclispe or Spring ToolSuite, do not forget install Grails/Groovy plugin from SpringSource, or download a copy of SpringSource Grails/Groovy Suite for groovy development.

Sample codes

The samples codes is hosted on my github.com account.

https://github.com/hantsy/spring4-sandbox

你可能感兴趣的:(spring,groovy,DSL)