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