提交 5d586760 编写于 作者: J Juergen Hoeller

Consistent equality check for parent name and indexed arguments

Closes gh-23593
上级 18ae3790
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -401,7 +401,7 @@ public class ConstructorArgumentValues { ...@@ -401,7 +401,7 @@ public class ConstructorArgumentValues {
for (Map.Entry<Integer, ValueHolder> entry : this.indexedArgumentValues.entrySet()) { for (Map.Entry<Integer, ValueHolder> entry : this.indexedArgumentValues.entrySet()) {
ValueHolder vh1 = entry.getValue(); ValueHolder vh1 = entry.getValue();
ValueHolder vh2 = that.indexedArgumentValues.get(entry.getKey()); ValueHolder vh2 = that.indexedArgumentValues.get(entry.getKey());
if (!vh1.contentEquals(vh2)) { if (vh2 == null || !vh1.contentEquals(vh2)) {
return false; return false;
} }
} }
......
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
package org.springframework.beans.factory.support; package org.springframework.beans.factory.support;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.util.ObjectUtils;
/** /**
* GenericBeanDefinition is a one-stop shop for standard bean definition purposes. * GenericBeanDefinition is a one-stop shop for standard bean definition purposes.
...@@ -81,7 +82,14 @@ public class GenericBeanDefinition extends AbstractBeanDefinition { ...@@ -81,7 +82,14 @@ public class GenericBeanDefinition extends AbstractBeanDefinition {
@Override @Override
public boolean equals(Object other) { public boolean equals(Object other) {
return (this == other || (other instanceof GenericBeanDefinition && super.equals(other))); if (this == other) {
return true;
}
if (!(other instanceof GenericBeanDefinition)) {
return false;
}
GenericBeanDefinition that = (GenericBeanDefinition) other;
return (ObjectUtils.nullSafeEquals(this.parentName, that.parentName) && super.equals(other));
} }
@Override @Override
......
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -811,26 +811,24 @@ public class DefaultListableBeanFactoryTests { ...@@ -811,26 +811,24 @@ public class DefaultListableBeanFactoryTests {
} }
@Test @Test
public void testBeanDefinitionOverriding() { public void testAliasChaining() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.registerBeanDefinition("test", new RootBeanDefinition(TestBean.class));
lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class)); lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
lbf.registerAlias("otherTest", "test2"); lbf.registerAlias("test", "testAlias");
lbf.registerAlias("test", "test2"); lbf.registerAlias("testAlias", "testAlias2");
assertTrue(lbf.getBean("test") instanceof NestedTestBean); lbf.registerAlias("testAlias2", "testAlias3");
assertTrue(lbf.getBean("test2") instanceof NestedTestBean); Object bean = lbf.getBean("test");
assertSame(bean, lbf.getBean("testAlias"));
assertSame(bean, lbf.getBean("testAlias2"));
assertSame(bean, lbf.getBean("testAlias3"));
} }
@Test @Test
public void testBeanDefinitionRemoval() { public void testBeanDefinitionOverriding() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.setAllowBeanDefinitionOverriding(false);
lbf.registerBeanDefinition("test", new RootBeanDefinition(TestBean.class)); lbf.registerBeanDefinition("test", new RootBeanDefinition(TestBean.class));
lbf.registerAlias("test", "test2");
lbf.preInstantiateSingletons();
lbf.removeBeanDefinition("test");
lbf.removeAlias("test2");
lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class)); lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
lbf.registerAlias("otherTest", "test2");
lbf.registerAlias("test", "test2"); lbf.registerAlias("test", "test2");
assertTrue(lbf.getBean("test") instanceof NestedTestBean); assertTrue(lbf.getBean("test") instanceof NestedTestBean);
assertTrue(lbf.getBean("test2") instanceof NestedTestBean); assertTrue(lbf.getBean("test2") instanceof NestedTestBean);
...@@ -863,16 +861,31 @@ public class DefaultListableBeanFactoryTests { ...@@ -863,16 +861,31 @@ public class DefaultListableBeanFactoryTests {
} }
@Test @Test
public void testAliasChaining() { public void beanDefinitionOverridingWithConstructorArgumentMismatch() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
RootBeanDefinition bd1 = new RootBeanDefinition(NestedTestBean.class);
bd1.getConstructorArgumentValues().addIndexedArgumentValue(1, "value1");
lbf.registerBeanDefinition("test", bd1);
RootBeanDefinition bd2 = new RootBeanDefinition(NestedTestBean.class);
bd2.getConstructorArgumentValues().addIndexedArgumentValue(0, "value0");
lbf.registerBeanDefinition("test", bd2);
assertTrue(lbf.getBean("test") instanceof NestedTestBean);
assertEquals("value0", lbf.getBean("test", NestedTestBean.class).getCompany());
}
@Test
public void testBeanDefinitionRemoval() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.setAllowBeanDefinitionOverriding(false);
lbf.registerBeanDefinition("test", new RootBeanDefinition(TestBean.class));
lbf.registerAlias("test", "test2");
lbf.preInstantiateSingletons();
lbf.removeBeanDefinition("test");
lbf.removeAlias("test2");
lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class)); lbf.registerBeanDefinition("test", new RootBeanDefinition(NestedTestBean.class));
lbf.registerAlias("test", "testAlias"); lbf.registerAlias("test", "test2");
lbf.registerAlias("testAlias", "testAlias2"); assertTrue(lbf.getBean("test") instanceof NestedTestBean);
lbf.registerAlias("testAlias2", "testAlias3"); assertTrue(lbf.getBean("test2") instanceof NestedTestBean);
Object bean = lbf.getBean("test");
assertSame(bean, lbf.getBean("testAlias"));
assertSame(bean, lbf.getBean("testAlias2"));
assertSame(bean, lbf.getBean("testAlias3"));
} }
@Test @Test
......
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -100,6 +100,25 @@ public class BeanDefinitionTests { ...@@ -100,6 +100,25 @@ public class BeanDefinitionTests {
assertTrue(bd.hashCode() == otherBd.hashCode()); assertTrue(bd.hashCode() == otherBd.hashCode());
} }
@Test
public void genericBeanDefinitionEquality() {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setParentName("parent");
bd.setScope("request");
bd.setAbstract(true);
bd.setLazyInit(true);
GenericBeanDefinition otherBd = new GenericBeanDefinition();
otherBd.setScope("request");
otherBd.setAbstract(true);
otherBd.setLazyInit(true);
assertTrue(!bd.equals(otherBd));
assertTrue(!otherBd.equals(bd));
otherBd.setParentName("parent");
assertTrue(bd.equals(otherBd));
assertTrue(otherBd.equals(bd));
assertTrue(bd.hashCode() == otherBd.hashCode());
}
@Test @Test
public void beanDefinitionHolderEquality() { public void beanDefinitionHolderEquality() {
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class); RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册