From 0d0de05ae69f0fe0b8a9c28796a2ada8efaeda0b Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Wed, 18 Dec 2013 15:01:44 +0000 Subject: [PATCH] Add support for Groovy bean builder sources --- spring-boot/pom.xml | 5 +++++ .../boot/BeanDefinitionLoader.java | 18 +++++++++++++++-- .../boot/BeanDefinitionLoaderTests.java | 20 +++++++++++++++++++ .../springframework/boot/sample-beans.groovy | 5 +++++ 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 spring-boot/src/test/resources/org/springframework/boot/sample-beans.groovy diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 22022b97653..78b59d139ae 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -49,6 +49,11 @@ tomcat-embed-core true + + org.codehaus.groovy + groovy + true + org.eclipse.jetty jetty-webapp diff --git a/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java b/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java index ea85a32e05d..962ec56cb0e 100644 --- a/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java +++ b/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java @@ -20,6 +20,8 @@ import java.io.IOException; import java.util.HashSet; import java.util.Set; +import org.springframework.beans.factory.BeanDefinitionStoreException; +import org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; @@ -57,6 +59,8 @@ class BeanDefinitionLoader { private XmlBeanDefinitionReader xmlReader; + private GroovyBeanDefinitionReader groovyReader; + private ClassPathBeanDefinitionScanner scanner; private ResourceLoader resourceLoader; @@ -73,6 +77,9 @@ class BeanDefinitionLoader { this.sources = sources; this.annotatedReader = new AnnotatedBeanDefinitionReader(registry); this.xmlReader = new XmlBeanDefinitionReader(registry); + if (ClassUtils.isPresent("groovy.lang.MetaClass", null)) { + this.groovyReader = new GroovyBeanDefinitionReader(this.xmlReader); + } this.scanner = new ClassPathBeanDefinitionScanner(registry); this.scanner.addExcludeFilter(new ClassExcludeFilter(sources)); } @@ -145,6 +152,13 @@ class BeanDefinitionLoader { } private int load(Resource source) { + if (source.getFilename().endsWith(".groovy")) { + if (this.groovyReader == null) { + throw new BeanDefinitionStoreException( + "Cannot load Groovy beans without Groovy on classpath"); + } + return this.groovyReader.loadBeanDefinitions(source); + } return this.xmlReader.loadBeanDefinitions(source); } @@ -169,7 +183,7 @@ class BeanDefinitionLoader { } // Attempt as resources - Resource[] resources = loadResources(resolvedSource); + Resource[] resources = findResources(resolvedSource); int loadCount = 0; boolean atLeastOneResourceExists = false; for (Resource resource : resources) { @@ -191,7 +205,7 @@ class BeanDefinitionLoader { throw new IllegalArgumentException("Invalid source '" + resolvedSource + "'"); } - private Resource[] loadResources(String source) { + private Resource[] findResources(String source) { ResourceLoader loader = this.resourceLoader != null ? this.resourceLoader : DEFAULT_RESOURCE_LOADER; try { diff --git a/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java b/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java index aa47427b41a..31dd422d2d9 100644 --- a/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java @@ -61,6 +61,17 @@ public class BeanDefinitionLoaderTests { } + @Test + public void loadGroovyResource() throws Exception { + ClassPathResource resource = new ClassPathResource("sample-beans.groovy", + getClass()); + BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, resource); + int loaded = loader.load(); + assertThat(loaded, equalTo(1)); + assertTrue(this.registry.containsBean("myGroovyComponent")); + + } + @Test public void loadPackage() throws Exception { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, @@ -88,6 +99,15 @@ public class BeanDefinitionLoaderTests { assertTrue(this.registry.containsBean("myXmlComponent")); } + @Test + public void loadGroovyName() throws Exception { + BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, + "classpath:org/springframework/boot/sample-beans.groovy"); + int loaded = loader.load(); + assertThat(loaded, equalTo(1)); + assertTrue(this.registry.containsBean("myGroovyComponent")); + } + @Test public void loadPackageName() throws Exception { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, diff --git a/spring-boot/src/test/resources/org/springframework/boot/sample-beans.groovy b/spring-boot/src/test/resources/org/springframework/boot/sample-beans.groovy new file mode 100644 index 00000000000..c867cc14b30 --- /dev/null +++ b/spring-boot/src/test/resources/org/springframework/boot/sample-beans.groovy @@ -0,0 +1,5 @@ +import org.springframework.boot.sampleconfig.MyComponent; + +beans { + myGroovyComponent(MyComponent) {} +} \ No newline at end of file