接近Spring实现一个IOC框架之设计Bean属性值集合

可变的属性值集合类

在上篇文章中的Bean定义中可以发现属性值集合接口光有属性值的获取,那属性值总得要添加并且存储起来才能获取到吧,想来想去,那就实现下这个接口,把添加和获取一次性搞定不就好了,哈哈!那就整个既可以添加修改又可以获取的属性值集合类吧,我们学下Spring大哥取名为MutablePropertyValues吧。

1
2
public class MutablePropertyValues  implements PropertyValues{
}

首先我们要做的就是怎么把属性值存储起来,这里先简单点声明一个List接口类型的字段好了,体现了面向接口编程嘛。

存储属性值

1
2
//没有泛型
List propertyValueList;

初始化属性值列表

注意这里先不使用泛型,也不声明为final,好的那接下来就要定义构造函数了。先写个默认的吧:

无参默认初始化

1
2
3
public MutablePropertyValues() {
this.propertyValueList = new ArrayList(10);
}

默认定义一个10元素容量的ArrayList给到propertyValueList。再想想我们可能会从另外一个属性值集合复制属性过来也不是不可能嘛,那么就可以定义一个具有PropertyValues接口类型参数的构造函数吧:

拷贝其他属性值集合

1
2
3
4
5
6
7
public MutablePropertyValues(PropertyValues other) {
PropertyValue[] pvs = other.getPropertyValues();
propertyValueList =new ArrayList(pvs.length);
for (int i = 0; i < pvs.length; i++){
addPropertyValue(new PropertyValue(pvs[i].getName(),pvs[i].getValue()));
}
}

因为PropertyValues接口有获取属性值列表的方法,那么我们就可以直接使用它遍历添加到当前集合中,这里就体现了面向接口编程的灵活咯。其中addPropertyValue就体现了MutablePropertyValues类存在的一个作用:添加属性值。

添加属性值

1
2
3
public void addPropertyValue(PropertyValue pv){
propertyValueList.add(pv);
}

Map初始化属性值列表

做到这里再想想,是否有可能从一个Map拷贝属性值过来呢,因为Map就是一个K-V存储嘛,完全有可能,那就再来个构造函数吧:

1
2
3
4
5
6
7
8
9
10
public MutablePropertyValues(Map map) {

Set keys =map.keySet();
propertyValueList = new ArrayList(keys.size());
Iterator itr = keys.iterator();
while (itr.hasNext()){
String key = (String) itr.next();
addPropertyValue(new PropertyValue(key,map.get(key)));
}
}

内部先获取Map中key的Set集合,然后它的迭代器来遍历,爽歪歪啊!

好了,到这里我们还漏了实现PropertyValues接口定义的方法哦,不然会编译不通过的,首先就是获取属性值列表:

获取属性值列表

1
2
3
4
@Override
public PropertyValue[] getPropertyValues() {
return (PropertyValue[]) propertyValueList.toArray(new PropertyValue[0]);
}

很简单,直接用propertyValueList转成数组输出。接下来就实现下根据属性名称判断是否包含某个属性值咯

根据名称判断是否包含对应属性值

1
2
3
4
@Override
public boolean contains(String propertyName) {
return getPropertyValue(propertyName) != null;
}

这个包含判断是建立在获取某个属性值基础上的。

根据名称获取对应属性值

遍历propertyValueList集合列表,循环判断名称是否相同。

1
2
3
4
5
6
7
8
9
10
@Override
public PropertyValue getPropertyValue(String propertyName) {
for (int i =0; i <propertyValueList.size();i++){

PropertyValue pv = (PropertyValue) propertyValueList.get(0);
if(pv.getName().equals(propertyName))
return pv;
}
return null;
}

最后想一下,既然内部存储的是List,那么我们就可以直接在List的某一个位置替换属性值?!注意是替换哦 上代码:

1
2
3
public void setPropertyValueAt(PropertyValue pv,int i){  
propertyValueList.set(i,pv);
}

好了,到这里一个可修改的属性值集合类就大功告成了,接下来我们就该再回过头优化优化我们的Bean定义咯!

欢迎关注我的公众号:沉迷Spring
显示 Gitment 评论
0%