Transform the beanName in method isPrimary

Transform the beanName in method DefaultListableBeanFactory.isPrimary.
Add the corresponding test cases.
Fixes #22675.
This commit is contained in:
liguoxiong 2019-03-30 20:52:19 +08:00 committed by Juergen Hoeller
parent a11a592734
commit 7b11c3b599
2 changed files with 40 additions and 3 deletions

View File

@ -1603,12 +1603,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
* @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));
}
/**

View File

@ -1455,6 +1455,24 @@ public class DefaultListableBeanFactoryTests {
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 class DefaultListableBeanFactoryTests {
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();