最近在分析Spring的源码,但对其中一个问题很困惑,现描述如下,希望各位帮忙分析一下:
在IoC容器实例化Bean后,Bean只是个半成品,IoC容器将调用BeanWrapper的实现类BeanWrapperImp对这个实例进行属性值填充的后续工作。BeanWrapperImpl的类结构如下所示:
PropertyEditorRegistry
|
PropertyEditorRegistrySupport
|
BeanWrapper AbstractPropertyAccessor
| |
|___________________|
|
BeanWrapperImpl
在PropertyEditorRegistrySupport中定义了两个Map类型的defaultEditors和customEditors,用于存放常见类型(String Integer等原子类型)和自定义类型的属性编辑器。
private Map defaultEditors;
private Map customEditors;
所以,BeanWrapperImpl也拥有继承了这些编辑器,但是我有一点不明白的是,为什么BeanWrapperImpl不是容器级的,而是Bean级的:即在容器主控制程序中,每实例化一个Bean时,都要new一个BeanWrapperImpl实例出来,请看:
protected BeanWrapper instantiateBean(String beanName,
RootBeanDefinition mergedBeanDefinition)
throws BeansException {
Object beanInstance = getInstantiationStrategy().instantiate(mergedBeanDefinition, beanName, this);
[b]BeanWrapper bw = new BeanWrapperImpl(beanInstance);[/b]
initBeanWrapper(bw);
return bw;
}
这样一来属性编辑器的实例会被多次创建,因为每个BeanWrapperImpl对应一套属性编辑器,而在我看来这些属性编辑器应该是容器级的,也就是说只要保存一份就可以了,现在的情况是每创建一个Bean都对应一份,不但没有必要,而且浪费资源。
不知道是我没有看出其中的机巧,还是Rod的设计失误,请大家帮助分析一下,不胜感激。