From c0a2c88da10822cebdbc5e28ff48df1dc4b04295 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 4 Feb 2016 13:49:59 +0000 Subject: [PATCH] =?UTF-8?q?Stop=20referring=20to=20optional=20classes=20in?= =?UTF-8?q?=20BeanDefinitionLoader=E2=80=99s=20signature?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, BeanDefinitionLoader declared a field of type GroovyBeanDefinitionReader which is a GroovyObject subclass. This is problematic as BeanDefinitionLoader is always loaded but Groovy is an optional dependency. Even on a JVM where class verification is performed lazily, this can still cause problems if something reflectively tries to access the class’s declared fields. On a JVM where classes are verified at load time, it would be impossible to start a Spring Boot application without having Groovy on the classpath. This commit changes the field to be a BeanDefinitionReader, removing the indirect reference to GroovyObject form BeanDefinitionLoader’s signature. The reader is downcast to a GroovyBeanDefinitionReader in the body of a method body that will only be invoked when Groovy is on the classpath. Closes gh-5040 --- .../org/springframework/boot/BeanDefinitionLoader.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 7b242ebb787..0c9aedb2a89 100644 --- a/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java +++ b/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import groovy.lang.Closure; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader; +import org.springframework.beans.factory.support.BeanDefinitionReader; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; @@ -60,7 +61,7 @@ class BeanDefinitionLoader { private final XmlBeanDefinitionReader xmlReader; - private GroovyBeanDefinitionReader groovyReader; + private BeanDefinitionReader groovyReader; private final ClassPathBeanDefinitionScanner scanner; @@ -162,7 +163,7 @@ class BeanDefinitionLoader { private int load(GroovyBeanDefinitionSource source) { int before = this.xmlReader.getRegistry().getBeanDefinitionCount(); - this.groovyReader.beans(source.getBeans()); + ((GroovyBeanDefinitionReader) this.groovyReader).beans(source.getBeans()); int after = this.xmlReader.getRegistry().getBeanDefinitionCount(); return after - before; }