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 331597a680a8..e916ab7121e8 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 @@ -1603,12 +1603,13 @@ else if (candidatePriority < highestPriority) { * @return whether the given bean qualifies as primary */ protected boolean isPrimary(String beanName, Object beanInstance) { - if (containsBeanDefinition(beanName)) { - return getMergedLocalBeanDefinition(beanName).isPrimary(); + String transformedBeanName = transformedBeanName(beanName); + if (containsBeanDefinition(transformedBeanName)) { + return getMergedLocalBeanDefinition(transformedBeanName).isPrimary(); } BeanFactory parent = getParentBeanFactory(); return (parent instanceof DefaultListableBeanFactory && - ((DefaultListableBeanFactory) parent).isPrimary(beanName, beanInstance)); + ((DefaultListableBeanFactory) parent).isPrimary(transformedBeanName, beanInstance)); } /** 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 86b8fca73821..e4c1adaf7793 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 @@ -1455,6 +1455,24 @@ public void testGetBeanByTypeWithPrimary() { assertFalse(lbf.containsSingleton("bd1")); } + @Test + public void testGetFactoryBeanByTypeWithPrimary() { + DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); + RootBeanDefinition bd1 = new RootBeanDefinition(NullTestBeanFactoryBean.class); + RootBeanDefinition bd2 = new RootBeanDefinition(NullTestBeanFactoryBean.class); + bd2.setPrimary(true); + lbf.registerBeanDefinition("bd1", bd1); + lbf.registerBeanDefinition("bd2", bd2); + NullTestBeanFactoryBean factoryBeanByType = lbf.getBean(NullTestBeanFactoryBean.class); + NullTestBeanFactoryBean bd1FactoryBean = (NullTestBeanFactoryBean)lbf.getBean("&bd1"); + NullTestBeanFactoryBean bd2FactoryBean = (NullTestBeanFactoryBean)lbf.getBean("&bd2"); + assertNotNull(factoryBeanByType); + assertNotNull(bd1FactoryBean); + assertNotNull(bd2FactoryBean); + assertNotEquals(factoryBeanByType, bd1FactoryBean); + assertEquals(factoryBeanByType, bd2FactoryBean); + } + @Test public void testGetBeanByTypeWithMultiplePrimary() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); @@ -1869,6 +1887,24 @@ public void testAutowireBeanWithFactoryBeanByType() { factoryBean, bean.getFactoryBean()); } + @Test + public void testAutowireBeanWithFactoryBeanByTypeWithPrimary() { + DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); + RootBeanDefinition bd1 = new RootBeanDefinition(LazyInitFactory.class); + RootBeanDefinition bd2 = new RootBeanDefinition(LazyInitFactory.class); + bd2.setPrimary(true); + lbf.registerBeanDefinition("bd1", bd1); + lbf.registerBeanDefinition("bd2", bd2); + LazyInitFactory bd1FactoryBean = (LazyInitFactory) lbf.getBean("&bd1"); + LazyInitFactory bd2FactoryBean = (LazyInitFactory) lbf.getBean("&bd2"); + assertNotNull(bd1FactoryBean); + assertNotNull(bd2FactoryBean); + FactoryBeanDependentBean bean = (FactoryBeanDependentBean) lbf.autowire(FactoryBeanDependentBean.class, + AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true); + assertNotEquals(bd1FactoryBean, bean.getFactoryBean()); + assertEquals(bd2FactoryBean, bean.getFactoryBean()); + } + @Test public void testGetTypeForAbstractFactoryBean() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();