困惑:谁能帮我解答一个关于BeanWrapperImpl设计的问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值