diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/xml/UtilNamespaceHandlerTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/xml/UtilNamespaceHandlerTests.java index 5d47ea83084..980289d9e2c 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/xml/UtilNamespaceHandlerTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/xml/UtilNamespaceHandlerTests.java @@ -28,6 +28,7 @@ import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.config.DependencyDescriptor; import org.springframework.beans.factory.config.FieldRetrievingFactoryBean; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.beans.factory.parsing.ComponentDefinition; @@ -46,7 +47,6 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Juergen Hoeller * @author Mark Fisher */ -@SuppressWarnings("rawtypes") class UtilNamespaceHandlerTests { private DefaultListableBeanFactory beanFactory; @@ -55,7 +55,7 @@ class UtilNamespaceHandlerTests { @BeforeEach - void setUp() { + void setup() { this.beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this.beanFactory); reader.setEventListener(this.listener); @@ -109,17 +109,17 @@ class UtilNamespaceHandlerTests { @Test void testSimpleMap() { - Map map = (Map) this.beanFactory.getBean("simpleMap"); + Map map = (Map) this.beanFactory.getBean("simpleMap"); assertThat(map.get("foo")).isEqualTo("bar"); - Map map2 = (Map) this.beanFactory.getBean("simpleMap"); + Map map2 = (Map) this.beanFactory.getBean("simpleMap"); assertThat(map).isSameAs(map2); } @Test void testScopedMap() { - Map map = (Map) this.beanFactory.getBean("scopedMap"); + Map map = (Map) this.beanFactory.getBean("scopedMap"); assertThat(map.get("foo")).isEqualTo("bar"); - Map map2 = (Map) this.beanFactory.getBean("scopedMap"); + Map map2 = (Map) this.beanFactory.getBean("scopedMap"); assertThat(map2.get("foo")).isEqualTo("bar"); assertThat(map).isNotSameAs(map2); } @@ -164,17 +164,23 @@ class UtilNamespaceHandlerTests { } @Test - void testMapWithRef() { - Map map = (Map) this.beanFactory.getBean("mapWithRef"); + void testMapWithRef() throws Exception { + Map map = (Map) this.beanFactory.getBean("mapWithRef"); assertThat(map).isInstanceOf(TreeMap.class); assertThat(map.get("bean")).isEqualTo(this.beanFactory.getBean("testBean")); + assertThat(this.beanFactory.resolveDependency( + new DependencyDescriptor(getClass().getDeclaredField("mapWithRef"), true), null)) + .isSameAs(map); } @Test - void testMapWithTypes() { - Map map = (Map) this.beanFactory.getBean("mapWithTypes"); + void testMapWithTypes() throws Exception { + Map map = (Map) this.beanFactory.getBean("mapWithTypes"); assertThat(map).isInstanceOf(LinkedCaseInsensitiveMap.class); assertThat(map.get("bean")).isEqualTo(this.beanFactory.getBean("testBean")); + assertThat(this.beanFactory.resolveDependency( + new DependencyDescriptor(getClass().getDeclaredField("mapWithTypes"), true), null)) + .isSameAs(map); } @Test @@ -240,11 +246,11 @@ class UtilNamespaceHandlerTests { void testCircularCollections() { TestBean bean = (TestBean) this.beanFactory.getBean("circularCollectionsBean"); - assertThat(bean.getSomeList()).singleElement().isEqualTo(bean); - assertThat(bean.getSomeSet()).singleElement().isEqualTo(bean); + assertThat(bean.getSomeList()).singleElement().isSameAs(bean); + assertThat(bean.getSomeSet()).singleElement().isSameAs(bean); assertThat(bean.getSomeMap()).hasSize(1).allSatisfy((key, value) -> { assertThat(key).isEqualTo("foo"); - assertThat(value).isEqualTo(bean); + assertThat(value).isSameAs(bean); }); } @@ -255,17 +261,17 @@ class UtilNamespaceHandlerTests { List list = bean.getSomeList(); assertThat(Proxy.isProxyClass(list.getClass())).isTrue(); - assertThat(list).singleElement().isEqualTo(bean); + assertThat(list).singleElement().isSameAs(bean); Set set = bean.getSomeSet(); assertThat(Proxy.isProxyClass(set.getClass())).isFalse(); - assertThat(set).singleElement().isEqualTo(bean); + assertThat(set).singleElement().isSameAs(bean); Map map = bean.getSomeMap(); assertThat(Proxy.isProxyClass(map.getClass())).isFalse(); assertThat(map).hasSize(1).allSatisfy((key, value) -> { assertThat(key).isEqualTo("foo"); - assertThat(value).isEqualTo(bean); + assertThat(value).isSameAs(bean); }); } @@ -276,17 +282,17 @@ class UtilNamespaceHandlerTests { List list = bean.getSomeList(); assertThat(Proxy.isProxyClass(list.getClass())).isFalse(); - assertThat(list).singleElement().isEqualTo(bean); + assertThat(list).singleElement().isSameAs(bean); Set set = bean.getSomeSet(); assertThat(Proxy.isProxyClass(set.getClass())).isTrue(); - assertThat(set).singleElement().isEqualTo(bean); + assertThat(set).singleElement().isSameAs(bean); Map map = bean.getSomeMap(); assertThat(Proxy.isProxyClass(map.getClass())).isFalse(); assertThat(map).hasSize(1).allSatisfy((key, value) -> { assertThat(key).isEqualTo("foo"); - assertThat(value).isEqualTo(bean); + assertThat(value).isSameAs(bean); }); } @@ -297,17 +303,17 @@ class UtilNamespaceHandlerTests { List list = bean.getSomeList(); assertThat(Proxy.isProxyClass(list.getClass())).isFalse(); - assertThat(list).singleElement().isEqualTo(bean); + assertThat(list).singleElement().isSameAs(bean); Set set = bean.getSomeSet(); assertThat(Proxy.isProxyClass(set.getClass())).isFalse(); - assertThat(set).singleElement().isEqualTo(bean); + assertThat(set).singleElement().isSameAs(bean); Map map = bean.getSomeMap(); assertThat(Proxy.isProxyClass(map.getClass())).isTrue(); assertThat(map).hasSize(1).allSatisfy((key, value) -> { assertThat(key).isEqualTo("foo"); - assertThat(value).isEqualTo(bean); + assertThat(value).isSameAs(bean); }); } @@ -372,4 +378,9 @@ class UtilNamespaceHandlerTests { assertThat(props).as("Incorrect property value").containsEntry("foo2", "local2"); } + + // For DependencyDescriptor resolution + private Map mapWithRef; + private Map mapWithTypes; + } diff --git a/spring-context/src/test/java/org/springframework/validation/beanvalidation/SpringValidatorAdapterTests.java b/spring-context/src/test/java/org/springframework/validation/beanvalidation/SpringValidatorAdapterTests.java index da9eb0b0434..c87ccfc7290 100644 --- a/spring-context/src/test/java/org/springframework/validation/beanvalidation/SpringValidatorAdapterTests.java +++ b/spring-context/src/test/java/org/springframework/validation/beanvalidation/SpringValidatorAdapterTests.java @@ -503,10 +503,6 @@ class SpringValidatorAdapterTests { private static final String ID = "id"; - @Override - public void initialize(AnythingValid constraintAnnotation) { - } - @Override public boolean isValid(Object value, ConstraintValidatorContext context) { List fieldsErrors = new ArrayList<>(); diff --git a/spring-context/src/test/java/org/springframework/validation/beanvalidation/ValidatorFactoryTests.java b/spring-context/src/test/java/org/springframework/validation/beanvalidation/ValidatorFactoryTests.java index 5dd8e3cf360..a75b120b12c 100644 --- a/spring-context/src/test/java/org/springframework/validation/beanvalidation/ValidatorFactoryTests.java +++ b/spring-context/src/test/java/org/springframework/validation/beanvalidation/ValidatorFactoryTests.java @@ -425,10 +425,6 @@ class ValidatorFactoryTests { @Autowired private Environment environment; - @Override - public void initialize(NameAddressValid constraintAnnotation) { - } - @Override public boolean isValid(ValidPerson value, ConstraintValidatorContext context) { if (value.expectsAutowiredValidator) { @@ -495,10 +491,6 @@ class ValidatorFactoryTests { public static class InnerValidator implements ConstraintValidator { - @Override - public void initialize(InnerValid constraintAnnotation) { - } - @Override public boolean isValid(InnerBean bean, ConstraintValidatorContext context) { context.disableDefaultConstraintViolation(); @@ -542,10 +534,6 @@ class ValidatorFactoryTests { public static class NotXListValidator implements ConstraintValidator> { - @Override - public void initialize(NotXList constraintAnnotation) { - } - @Override public boolean isValid(List list, ConstraintValidatorContext context) { context.disableDefaultConstraintViolation(); diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/config/SortedResourcesFactoryBean.java b/spring-jdbc/src/main/java/org/springframework/jdbc/config/SortedResourcesFactoryBean.java index ef05f0c665a..77776adf446 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/config/SortedResourcesFactoryBean.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/config/SortedResourcesFactoryBean.java @@ -18,8 +18,10 @@ package org.springframework.jdbc.config; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Comparator; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.config.AbstractFactoryBean; @@ -72,17 +74,26 @@ public class SortedResourcesFactoryBean extends AbstractFactoryBean protected Resource[] createInstance() throws Exception { List scripts = new ArrayList<>(); for (String location : this.locations) { - List resources = new ArrayList<>( - Arrays.asList(this.resourcePatternResolver.getResources(location))); - resources.sort((r1, r2) -> { + Resource[] resources = this.resourcePatternResolver.getResources(location); + + // Cache URLs to avoid repeated I/O during sorting + Map urlCache = new LinkedHashMap<>(resources.length); + for (Resource resource : resources) { try { - return r1.getURL().toString().compareTo(r2.getURL().toString()); + urlCache.put(resource, resource.getURL().toString()); } catch (IOException ex) { - return 0; + throw new IllegalStateException( + "Failed to resolve URL for resource [" + resource + + "] from location pattern [" + location + "]", ex); } - }); - scripts.addAll(resources); + } + + // Sort using cached URLs + List sortedResources = new ArrayList<>(urlCache.keySet()); + sortedResources.sort(Comparator.comparing(urlCache::get)); + + scripts.addAll(sortedResources); } return scripts.toArray(new Resource[0]); }