From 45a270b71f07636a5995711d0013ee0b7b8b508d Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 3 Apr 2020 21:12:03 +0200 Subject: [PATCH] Clear by-type cache in case of no pre-existing bean definition as well Closes gh-24852 --- .../support/DefaultListableBeanFactory.java | 3 ++ .../DefaultListableBeanFactoryTests.java | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java index 4e05ecf5f333..13e919090fa2 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java @@ -942,6 +942,9 @@ else if (!beanDefinition.equals(existingDefinition)) { if (existingDefinition != null || containsSingleton(beanName)) { resetBeanDefinition(beanName); } + else if (isConfigurationFrozen()) { + clearByTypeCache(); + } } @Override diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java index 374064f315d8..589ccc494505 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java @@ -1399,6 +1399,39 @@ public void testGetBeanByTypeWithNoneFound() { lbf.getBean(TestBean.class); } + @Test + public void testGetBeanByTypeWithLateRegistration() { + DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); + try { + lbf.getBean(TestBean.class); + fail("Should have thrown NoSuchBeanDefinitionException"); + } + catch (NoSuchBeanDefinitionException ex) { + // expected + } + RootBeanDefinition bd1 = new RootBeanDefinition(TestBean.class); + lbf.registerBeanDefinition("bd1", bd1); + TestBean bean = lbf.getBean(TestBean.class); + assertThat(bean.getBeanName(), equalTo("bd1")); + } + + @Test + public void testGetBeanByTypeWithLateRegistrationAgainstFrozen() { + DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); + lbf.freezeConfiguration(); + try { + lbf.getBean(TestBean.class); + fail("Should have thrown NoSuchBeanDefinitionException"); + } + catch (NoSuchBeanDefinitionException ex) { + // expected + } + RootBeanDefinition bd1 = new RootBeanDefinition(TestBean.class); + lbf.registerBeanDefinition("bd1", bd1); + TestBean bean = lbf.getBean(TestBean.class); + assertThat(bean.getBeanName(), equalTo("bd1")); + } + @Test public void testGetBeanByTypeDefinedInParent() { DefaultListableBeanFactory parent = new DefaultListableBeanFactory();