学习内容来自刘欣:从零开始造Spring
第四周: 实现构造函数注入
引入ConstructorArgument
如何找到合适的构造器: ConstructorResolver
//petstore-v3.xml
<bean id="petStore" class="org.litespring.service.v3.PetStoreService">
<constructor-arg ref="accountDao"/>
<constructor-arg ref="itemDao"/>
<constructor-arg value="1" />
</bean>
<bean id="accountDao" class="org.litespring.dao.v3.AccountDao"/>
<bean id="itemDao" class="org.litespring.dao.v3.ItemDao"/>
//新加测试方法
@Test
public void TestConstructorArgument(){
DefaultBeanFactory factory = new DefaultBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
ClassPathResource resource = new ClassPathResource("petstore-v3.xml");
reader.loadBeanDefiniton(resource);
BeanDefinition bd = factory.getBeanDefinition("petStore");
Assert.assertEquals("org.litespring.service.v3.PetStoreService",bd.getBeanClassName());
ConstructorArgument args =bd.getConstructorArgument();
List<ConstructorArgument.ValueHolder> valueHolders = args.getArgumentValues();
Assert.assertEquals(3,valueHolders.size());
RuntimeBeanReference ref1 = (RuntimeBeanReference)valueHolders.get(0).getValue();
Assert.assertEquals("accountDao",ref1.getBeanName());
RuntimeBeanReference ref2 = (RuntimeBeanReference)valueHolders.get(1).getValue();
Assert.assertEquals("itemDao",ref2.getBeanName());
TypedStringValue ref3 = (TypedStringValue)valueHolders.get(2).getValue();
Assert.assertEquals("1",ref3.getValue());
}
//增加 org.litespring.beans.ConstructorArgument
public class ConstructorArgument {
private final List<ValueHolder> argumentValues = new LinkedList<ValueHolder>();
//create a new empty constructorArgumentValues object
public ConstructorArgument() {
}
public void addArgumentValue(ValueHolder valueHolder){
this.argumentValues.add(valueHolder);
}
public List<ValueHolder> getArgumentValues() {
return Collections.unmodifiableList(argumentValues);
}
public int getArgumentCount(){
return this.argumentValues.size();
}
public boolean isEmpty(){
return this.argumentValues.isEmpty();
}
//Clear this holder , remove all argument values
public void clear(){
this.argumentValues.clear();
}
/**
* Holder for a constructor argument value, with an optional type
* attibute indicating the target type of actual construct argument