📄 defaultlistablebeanfactorytests.java
字号:
catch (UnsatisfiedDependencyException ex) {
// Ok
}
}
public void testExtensiveCircularReference() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
for (int i = 0; i < 1000; i++) {
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.addPropertyValue(new PropertyValue("spouse", new RuntimeBeanReference("bean" + (i < 99 ? i+1 : 0))));
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class, pvs);
lbf.registerBeanDefinition("bean" + i, bd);
}
lbf.preInstantiateSingletons();
for (int i = 0; i < 1000; i++) {
TestBean bean = (TestBean) lbf.getBean("bean" + i);
TestBean otherBean = (TestBean) lbf.getBean("bean" + (i < 99 ? i+1 : 0));
assertTrue(bean.getSpouse() == otherBean);
}
}
public void testCircularReferenceThroughAutowiring() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.registerBeanDefinition("test", new RootBeanDefinition(
ConstructorDependencyBean.class, RootBeanDefinition.AUTOWIRE_CONSTRUCTOR));
try {
lbf.preInstantiateSingletons();
}
catch (UnsatisfiedDependencyException ex) {
// expected
}
}
public void testCircularReferenceThroughFactoryBeanAutowiring() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.registerBeanDefinition("test", new RootBeanDefinition(
ConstructorDependencyFactoryBean.class, RootBeanDefinition.AUTOWIRE_CONSTRUCTOR));
try {
lbf.preInstantiateSingletons();
}
catch (UnsatisfiedDependencyException ex) {
// expected
}
}
public void testAvoidCircularReferenceThroughAutowiring() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.registerBeanDefinition("test", new RootBeanDefinition(
ConstructorDependencyFactoryBean.class, RootBeanDefinition.AUTOWIRE_CONSTRUCTOR));
lbf.registerBeanDefinition("string",
new RootBeanDefinition(String.class, RootBeanDefinition.AUTOWIRE_CONSTRUCTOR));
lbf.preInstantiateSingletons();
}
public void testApplyPropertyValues() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.addPropertyValue("age", "99");
lbf.registerBeanDefinition("test", new RootBeanDefinition(TestBean.class, pvs));
TestBean tb = new TestBean();
assertEquals(0, tb.getAge());
lbf.applyBeanPropertyValues(tb, "test");
assertEquals(99, tb.getAge());
}
public void testApplyPropertyValuesWithIncompleteDefinition() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.addPropertyValue("age", "99");
lbf.registerBeanDefinition("test", new RootBeanDefinition(null, pvs));
TestBean tb = new TestBean();
assertEquals(0, tb.getAge());
lbf.applyBeanPropertyValues(tb, "test");
assertEquals(99, tb.getAge());
}
public void testBeanDefinitionWithInterface() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.registerBeanDefinition("test", new RootBeanDefinition(ITestBean.class, null));
try {
lbf.getBean("test");
fail("Should have thrown BeanCreationException");
}
catch (BeanCreationException ex) {
assertEquals("test", ex.getBeanName());
assertTrue(ex.getMessage().toLowerCase().indexOf("interface") != -1);
}
}
public void testBeanDefinitionWithAbstractClass() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
lbf.registerBeanDefinition("test", new RootBeanDefinition(AbstractBeanFactory.class, null));
try {
lbf.getBean("test");
fail("Should have thrown BeanCreationException");
}
catch (BeanCreationException ex) {
assertEquals("test", ex.getBeanName());
assertTrue(ex.getMessage().toLowerCase().indexOf("abstract") != -1);
}
}
public void testBeanPostProcessorWithWrappedObjectAndDisposableBean() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
RootBeanDefinition bd = new RootBeanDefinition(BeanWithDisposableBean.class, null);
lbf.registerBeanDefinition("test", bd);
lbf.addBeanPostProcessor(new BeanPostProcessor() {
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return new TestBean();
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
});
BeanWithDisposableBean.closed = false;
lbf.preInstantiateSingletons();
lbf.destroySingletons();
assertTrue("Destroy method invoked", BeanWithDisposableBean.closed);
}
public void testBeanPostProcessorWithWrappedObjectAndDestroyMethod() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
RootBeanDefinition bd = new RootBeanDefinition(BeanWithDestroyMethod.class, null);
bd.setDestroyMethodName("close");
lbf.registerBeanDefinition("test", bd);
lbf.addBeanPostProcessor(new BeanPostProcessor() {
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return new TestBean();
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
});
BeanWithDestroyMethod.closed = false;
lbf.preInstantiateSingletons();
lbf.destroySingletons();
assertTrue("Destroy method invoked", BeanWithDestroyMethod.closed);
}
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"));
if (singleton) {
assertEquals(3, tbNames.size());
assertTrue(tbNames.contains("fmGeneric"));
}
else {
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 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();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -