diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java index 4627965ee64..3db8fbd2019 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java @@ -120,51 +120,43 @@ class BeanDefinitionLoader { /** * Load the sources into the reader. - * @return the number of loaded beans */ - int load() { - int count = 0; + void load() { for (Object source : this.sources) { - count += load(source); + load(source); } - return count; } - private int load(Object source) { + private void load(Object source) { Assert.notNull(source, "Source must not be null"); if (source instanceof Class) { - return load((Class) source); + load((Class) source); + return; } if (source instanceof Resource) { - return load((Resource) source); + load((Resource) source); + return; } if (source instanceof Package) { - return load((Package) source); + load((Package) source); + return; } if (source instanceof CharSequence) { - return load((CharSequence) source); + load((CharSequence) source); + return; } throw new IllegalArgumentException("Invalid source type " + source.getClass()); } - private int load(Class source) { + private void load(Class source) { if (isGroovyPresent() && GroovyBeanDefinitionSource.class.isAssignableFrom(source)) { // Any GroovyLoaders added in beans{} DSL can contribute beans here GroovyBeanDefinitionSource loader = BeanUtils.instantiateClass(source, GroovyBeanDefinitionSource.class); - load(loader); + ((GroovyBeanDefinitionReader) this.groovyReader).beans(loader.getBeans()); } if (isEligible(source)) { this.annotatedReader.register(source); - return 1; } - return 0; - } - - private int load(GroovyBeanDefinitionSource source) { - int before = this.xmlReader.getRegistry().getBeanDefinitionCount(); - ((GroovyBeanDefinitionReader) this.groovyReader).beans(source.getBeans()); - int after = this.xmlReader.getRegistry().getBeanDefinitionCount(); - return after - before; } private int load(Resource source) { @@ -181,36 +173,41 @@ class BeanDefinitionLoader { return this.scanner.scan(source.getName()); } - private int load(CharSequence source) { + private void load(CharSequence source) { String resolvedSource = this.xmlReader.getEnvironment().resolvePlaceholders(source.toString()); // Attempt as a Class try { - return load(ClassUtils.forName(resolvedSource, null)); + load(ClassUtils.forName(resolvedSource, null)); + return; } catch (IllegalArgumentException | ClassNotFoundException ex) { // swallow exception and continue } - // Attempt as resources - Resource[] resources = findResources(resolvedSource); - int loadCount = 0; - boolean atLeastOneResourceExists = false; - for (Resource resource : resources) { - if (isLoadCandidate(resource)) { - atLeastOneResourceExists = true; - loadCount += load(resource); - } - } - if (atLeastOneResourceExists) { - return loadCount; + // Attempt as Resources + if (loadAsResources(resolvedSource)) { + return; } // Attempt as package Package packageResource = findPackage(resolvedSource); if (packageResource != null) { - return load(packageResource); + load(packageResource); + return; } throw new IllegalArgumentException("Invalid source '" + resolvedSource + "'"); } + private boolean loadAsResources(String resolvedSource) { + boolean foundCandidate = false; + Resource[] resources = findResources(resolvedSource); + for (Resource resource : resources) { + if (isLoadCandidate(resource)) { + foundCandidate = true; + load(resource); + } + } + return foundCandidate; + } + private boolean isGroovyPresent() { return ClassUtils.isPresent("groovy.lang.MetaClass", null); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java index 7ddf590749b..8f64b6602e7 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/BeanDefinitionLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -51,7 +51,7 @@ class BeanDefinitionLoaderTests { @Test void loadClass() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, MyComponent.class); - assertThat(loader.load()).isEqualTo(1); + assertThat(load(loader)).isEqualTo(1); assertThat(this.registry.containsBean("myComponent")).isTrue(); } @@ -61,13 +61,13 @@ class BeanDefinitionLoaderTests { }; BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, myComponent.getClass()); - assertThat(loader.load()).isEqualTo(0); + assertThat(load(loader)).isEqualTo(0); } @Test void loadJsr330Class() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, MyNamedComponent.class); - assertThat(loader.load()).isEqualTo(1); + assertThat(load(loader)).isEqualTo(1); assertThat(this.registry.containsBean("myNamedComponent")).isTrue(); } @@ -75,7 +75,7 @@ class BeanDefinitionLoaderTests { void loadXmlResource() { ClassPathResource resource = new ClassPathResource("sample-beans.xml", getClass()); BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, resource); - assertThat(loader.load()).isEqualTo(1); + assertThat(load(loader)).isEqualTo(1); assertThat(this.registry.containsBean("myXmlComponent")).isTrue(); } @@ -84,7 +84,7 @@ class BeanDefinitionLoaderTests { void loadGroovyResource() { ClassPathResource resource = new ClassPathResource("sample-beans.groovy", getClass()); BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, resource); - assertThat(loader.load()).isEqualTo(1); + assertThat(load(loader)).isEqualTo(1); assertThat(this.registry.containsBean("myGroovyComponent")).isTrue(); } @@ -93,7 +93,7 @@ class BeanDefinitionLoaderTests { void loadGroovyResourceWithNamespace() { ClassPathResource resource = new ClassPathResource("sample-namespace.groovy", getClass()); BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, resource); - assertThat(loader.load()).isEqualTo(1); + assertThat(load(loader)).isEqualTo(1); assertThat(this.registry.containsBean("myGroovyComponent")).isTrue(); } @@ -101,7 +101,7 @@ class BeanDefinitionLoaderTests { @Test void loadPackage() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, MyComponent.class.getPackage()); - assertThat(loader.load()).isEqualTo(2); + assertThat(load(loader)).isEqualTo(2); assertThat(this.registry.containsBean("myComponent")).isTrue(); assertThat(this.registry.containsBean("myNamedComponent")).isTrue(); } @@ -109,7 +109,7 @@ class BeanDefinitionLoaderTests { @Test void loadClassName() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, MyComponent.class.getName()); - assertThat(loader.load()).isEqualTo(1); + assertThat(load(loader)).isEqualTo(1); assertThat(this.registry.containsBean("myComponent")).isTrue(); } @@ -117,7 +117,7 @@ class BeanDefinitionLoaderTests { void loadResourceName() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, "classpath:org/springframework/boot/sample-beans.xml"); - assertThat(loader.load()).isEqualTo(1); + assertThat(load(loader)).isEqualTo(1); assertThat(this.registry.containsBean("myXmlComponent")).isTrue(); } @@ -125,14 +125,14 @@ class BeanDefinitionLoaderTests { void loadGroovyName() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, "classpath:org/springframework/boot/sample-beans.groovy"); - assertThat(loader.load()).isEqualTo(1); + assertThat(load(loader)).isEqualTo(1); assertThat(this.registry.containsBean("myGroovyComponent")).isTrue(); } @Test void loadPackageName() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, MyComponent.class.getPackage().getName()); - assertThat(loader.load()).isEqualTo(2); + assertThat(load(loader)).isEqualTo(2); assertThat(this.registry.containsBean("myComponent")).isTrue(); assertThat(this.registry.containsBean("myNamedComponent")).isTrue(); } @@ -142,7 +142,7 @@ class BeanDefinitionLoaderTests { // See gh-6126 BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, MyComponentInPackageWithoutDot.class.getPackage().getName()); - int loaded = loader.load(); + int loaded = load(loader); assertThat(loaded).isEqualTo(1); assertThat(this.registry.containsBean("myComponentInPackageWithoutDot")).isTrue(); } @@ -151,9 +151,15 @@ class BeanDefinitionLoaderTests { void loadPackageAndClassDoesNotDoubleAdd() { BeanDefinitionLoader loader = new BeanDefinitionLoader(this.registry, MyComponent.class.getPackage(), MyComponent.class); - assertThat(loader.load()).isEqualTo(2); + assertThat(load(loader)).isEqualTo(2); assertThat(this.registry.containsBean("myComponent")).isTrue(); assertThat(this.registry.containsBean("myNamedComponent")).isTrue(); } + private int load(BeanDefinitionLoader loader) { + int beans = this.registry.getBeanDefinitionCount(); + loader.load(); + return this.registry.getBeanDefinitionCount() - beans; + } + }