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 d058be2bb7..80de1e3d25 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 @@ -1205,7 +1205,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto * Return whether the bean definition for the given bean name has been * marked as a primary bean. * @param beanName the name of the bean - * @param beanInstance the corresponding bean instance + * @param beanInstance the corresponding bean instance (can be null) * @return whether the given bean qualifies as primary */ protected boolean isPrimary(String beanName, Object beanInstance) { @@ -1221,11 +1221,14 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto * Return the priority assigned for the given bean instance by * the {@code javax.annotation.Priority} annotation. *

If the annotation is not present, returns {@code null}. - * @param beanInstance the bean instance to check + * @param beanInstance the bean instance to check (can be null) * @return the priority assigned to that bean or {@code null} if none is set */ protected Integer getPriority(Object beanInstance) { - return OrderUtils.getPriorityValue(beanInstance.getClass()); + if (beanInstance != null) { + return OrderUtils.getPriorityValue(beanInstance.getClass()); + } + return null; } /** 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 784f0faa23..b41a24ec4a 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 @@ -1403,6 +1403,17 @@ public class DefaultListableBeanFactoryTests { lbf.getBean(TestBean.class); } + @Test + public void testGetBeanByTypeWithPriorityAndNullInstance() throws Exception { + DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); + RootBeanDefinition bd1 = new RootBeanDefinition(HighPriorityTestBean.class); + RootBeanDefinition bd2 = new RootBeanDefinition(NullTestBeanFactoryBean.class); + lbf.registerBeanDefinition("bd1", bd1); + lbf.registerBeanDefinition("bd2", bd2); + TestBean bean = lbf.getBean(TestBean.class); + assertThat(bean.getBeanName(), equalTo("bd1")); + } + @Test public void testGetBeanByTypePrimaryHasPrecedenceOverPriority() throws Exception { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); @@ -2893,5 +2904,23 @@ public class DefaultListableBeanFactoryTests { @Priority(500) private static class LowPriorityTestBean extends TestBean {} + private static class NullTestBeanFactoryBean implements FactoryBean { + + @Override + public TestBean getObject() throws Exception { + return null; + } + + @Override + public Class getObjectType() { + return TestBean.class; + } + + @Override + public boolean isSingleton() { + return true; + } + } + }