📄 defaultlistablebeanfactorytests.java
字号:
public void testFindTypeOfSingletonFactoryMethodOnBeanInstance() {
findTypeOfPrototypeFactoryMethodOnBeanInstance(true);
}
public void testFindTypeOfPrototypeFactoryMethodOnBeanInstance() {
findTypeOfPrototypeFactoryMethodOnBeanInstance(false);
}
/**
* @param singleton whether the bean created from the factory method on
* the bean instance should be a singleton or prototype. This flag is
* used to allow checking of the new ability in 1.2.4 to determine the type
* of a prototype created from invoking a factory method on a bean instance
* in the factory.
*/
private void findTypeOfPrototypeFactoryMethodOnBeanInstance(boolean singleton) {
String expectedNameFromProperties = "tony";
String expectedNameFromArgs = "gordon";
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
RootBeanDefinition instanceFactoryDefinition = new RootBeanDefinition(BeanWithFactoryMethod.class, true);
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.addPropertyValue("name", expectedNameFromProperties);
instanceFactoryDefinition.setPropertyValues(pvs);
lbf.registerBeanDefinition("factoryBeanInstance", instanceFactoryDefinition);
RootBeanDefinition factoryMethodDefinitionWithProperties = new RootBeanDefinition();
factoryMethodDefinitionWithProperties.setFactoryBeanName("factoryBeanInstance");
factoryMethodDefinitionWithProperties.setFactoryMethodName("create");
factoryMethodDefinitionWithProperties.setSingleton(singleton);
lbf.registerBeanDefinition("fmWithProperties", factoryMethodDefinitionWithProperties);
RootBeanDefinition factoryMethodDefinitionGeneric = new RootBeanDefinition();
factoryMethodDefinitionGeneric.setFactoryBeanName("factoryBeanInstance");
factoryMethodDefinitionGeneric.setFactoryMethodName("createGeneric");
factoryMethodDefinitionGeneric.setSingleton(singleton);
lbf.registerBeanDefinition("fmGeneric", factoryMethodDefinitionGeneric);
RootBeanDefinition factoryMethodDefinitionWithArgs = new RootBeanDefinition();
factoryMethodDefinitionWithArgs.setFactoryBeanName("factoryBeanInstance");
factoryMethodDefinitionWithArgs.setFactoryMethodName("createWithArgs");
ConstructorArgumentValues cvals = new ConstructorArgumentValues();
cvals.addGenericArgumentValue(expectedNameFromArgs);
factoryMethodDefinitionWithArgs.setConstructorArgumentValues(cvals);
factoryMethodDefinitionWithArgs.setSingleton(singleton);
lbf.registerBeanDefinition("fmWithArgs", factoryMethodDefinitionWithArgs);
assertEquals(4, lbf.getBeanDefinitionCount());
List tbNames = Arrays.asList(lbf.getBeanNamesForType(TestBean.class));
assertTrue(tbNames.contains("fmWithProperties"));
assertTrue(tbNames.contains("fmWithArgs"));
assertEquals(2, tbNames.size());
TestBean tb = (TestBean) lbf.getBean("fmWithProperties");
TestBean second = (TestBean) lbf.getBean("fmWithProperties");
if (singleton) {
assertSame(tb, second);
}
else {
assertNotSame(tb, second);
}
assertEquals(expectedNameFromProperties, tb.getName());
tb = (TestBean) lbf.getBean("fmGeneric");
second = (TestBean) lbf.getBean("fmGeneric");
if (singleton) {
assertSame(tb, second);
}
else {
assertNotSame(tb, second);
}
assertEquals(expectedNameFromProperties, tb.getName());
TestBean tb2 = (TestBean) lbf.getBean("fmWithArgs");
second = (TestBean) lbf.getBean("fmWithArgs");
if (singleton) {
assertSame(tb2, second);
}
else {
assertNotSame(tb2, second);
}
assertEquals(expectedNameFromArgs, tb2.getName());
}
public void testFieldSettingWithInstantiationAwarePostProcessorNoShortCircuit() {
testFieldSettingWithInstantiationAwarePostProcessor(false);
}
public void testFieldSettingWithInstantiationAwarePostProcessorWithShortCircuit() {
testFieldSettingWithInstantiationAwarePostProcessor(true);
}
public void testScopingBeanToUnregisteredScopeResultsInAnException() throws Exception {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(TestBean.class);
AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
beanDefinition.setScope("he put himself so low could hardly look me in the face");
final DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
factory.registerBeanDefinition("testBean", beanDefinition);
new AssertThrows(IllegalStateException.class) {
public void test() throws Exception {
factory.getBean("testBean");
}
}.runTest();
}
public void testExplicitScopeInheritanceForChildBeanDefinitions() throws Exception {
String theChildScope = "bonanza!";
RootBeanDefinition parent = new RootBeanDefinition();
parent.setSingleton(false);
AbstractBeanDefinition child = BeanDefinitionBuilder
.childBeanDefinition("parent").getBeanDefinition();
child.setBeanClass(TestBean.class);
child.setScope(theChildScope);
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
factory.registerBeanDefinition("parent", parent);
factory.registerBeanDefinition("child", child);
AbstractBeanDefinition def = (AbstractBeanDefinition) factory.getBeanDefinition("child");
assertEquals("Child 'scope' not overriding parent scope (it must).", theChildScope, def.getScope());
}
public void testImplicitScopeInheritanceForChildBeanDefinitions() throws Exception {
RootBeanDefinition parent = new RootBeanDefinition();
parent.setScope("bonanza!");
AbstractBeanDefinition child = BeanDefinitionBuilder
.childBeanDefinition("parent").getBeanDefinition();
child.setBeanClass(TestBean.class);
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
factory.registerBeanDefinition("parent", parent);
factory.registerBeanDefinition("child", child);
AbstractBeanDefinition def = (AbstractBeanDefinition) factory.getBeanDefinition("child");
assertTrue("Child 'scope' not overriding parent scope (it must).", def.isSingleton());
}
private void testFieldSettingWithInstantiationAwarePostProcessor(final boolean skipPropertyPopulation) {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
int ageSetByPropertyValue = 27;
bd.getPropertyValues().addPropertyValue(new PropertyValue("age", new Integer(ageSetByPropertyValue)));
lbf.registerBeanDefinition("test", bd);
final String nameSetOnField = "nameSetOnField";
lbf.addBeanPostProcessor(new InstantiationAwareBeanPostProcessorAdapter() {
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
TestBean tb = (TestBean) bean;
try {
Field f = TestBean.class.getDeclaredField("name");
f.setAccessible(true);
f.set(tb, nameSetOnField);
return !skipPropertyPopulation;
}
catch (Exception ex) {
fail("Unexpected exception: " + ex);
// Keep compiler happy about return
throw new IllegalStateException();
}
}
});
lbf.preInstantiateSingletons();
TestBean tb = (TestBean) lbf.getBean("test");
assertEquals("Name was set on field by IAPP", nameSetOnField, tb.getName());
if (!skipPropertyPopulation) {
assertEquals("Property value still set", ageSetByPropertyValue, tb.getAge());
}
else {
assertEquals("Property value was NOT set and still has default value", 0, tb.getAge());
}
}
public static class NoDependencies {
private NoDependencies() {
}
}
public static class ConstructorDependency {
public TestBean spouse;
public ConstructorDependency(TestBean spouse) {
this.spouse = spouse;
}
private ConstructorDependency(TestBean spouse, TestBean otherSpouse) {
throw new IllegalArgumentException("Should never be called");
}
}
public static class UnsatisfiedConstructorDependency {
public UnsatisfiedConstructorDependency(TestBean t, SideEffectBean b) {
}
}
public static class ConstructorDependencyBean {
public ConstructorDependencyBean(ConstructorDependencyBean dependency) {
}
}
public static class ConstructorDependencyFactoryBean implements FactoryBean {
public ConstructorDependencyFactoryBean(String dependency) {
}
public Object getObject() {
return "test";
}
public Class getObjectType() {
return String.class;
}
public boolean isSingleton() {
return true;
}
}
public static class BeanWithDisposableBean implements DisposableBean {
private static boolean closed;
public void destroy() {
closed = true;
}
}
public static class BeanWithDestroyMethod {
private static boolean closed;
public void close() {
closed = true;
}
}
public static class BeanWithFactoryMethod {
private String name;
public void setName(String name) {
this.name = name;
}
public TestBean create() {
TestBean tb = new TestBean();
tb.setName(name);
return tb;
}
public TestBean createWithArgs(String arg) {
TestBean tb = new TestBean();
tb.setName(arg);
return tb;
}
public Object createGeneric() {
return create();
}
}
public static class FactoryBeanThatShouldntBeCalled implements FactoryBean {
public Object getObject() {
throw new IllegalStateException();
}
public Class getObjectType() {
return null;
}
public boolean isSingleton() {
return false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -