`

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

阅读更多
   最近在分析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的设计失误,请大家帮助分析一下,不胜感激。
分享到:
评论
9 楼 jamesby 2007-01-07  
stamen 写道
对于singleton确实是这样,但对应prototype,request,session和globalSession则会多次调用,性能问题还是会有的,我觉得至少可以智能你装入属性编辑器,而不是每个BeanWrapper都有一套完整的属性编辑器,假设某个Service的Bean,它仅注入一些Dao,但这个Bean的BeanWrapper也会拥有32个默认的属性编辑器实例。
恩,确实是这样,那是否Spring的初衷是为所有的Bean的配置尽量为Singleton呢?胡乱猜测大师想法.
8 楼 stamen 2007-01-06  
对于singleton确实是这样,但对应prototype,request,session和globalSession则会多次调用,性能问题还是会有的,我觉得至少可以智能你装入属性编辑器,而不是每个BeanWrapper都有一套完整的属性编辑器,假设某个Service的Bean,它仅注入一些Dao,但这个Bean的BeanWrapper也会拥有32个默认的属性编辑器实例。
7 楼 jamesby 2007-01-06  
我理解错了,今天粗读了一下相关代码,应该是这样的:
BeanWrapper的生命周期很短,在得到Bean实例的时候BeanWrapper就结束了.

而且PropertyEditor,CustomerEditor只有在getBean的时候才会用到,因此也不存在什么多个时刻用到BeanWrapper.
6 楼 jamesby 2007-01-05  
joachimz 写道
stamen说的不错,关键是PropertyEditor不是线程安全的。因此defaultEditors没办法公用,只能每次创建。
不过从性能看,现代JVM创建小对象的代价非常非常小,在实际应用中,这点性能消耗不会成为瓶颈。
而且我以前也专门针对这个问题测试过,只是第一次load class会有较大的性能损耗(需要load很多PropertyEditor),后续创建一个BeanWrapperImpl的成本可以忽略不计。
因为PropertyEditor不是线程安全的,但是从Spring的代码可以看出PropertyEditor是在BeanWrapper中声明的。

这样对于prototype类型的Bean没有问题,一个Bean一个BeanWrapper
但是对于singleton的Bean则有问题了,存在多个线程共用一个Bean的情况,也就是多个线程共用一个BeanWrapper的情况?

除非Spring对singleton类型的Bean创建多个BeanWrapper?

或者Spring只在某个时刻用到BeanWrapper,如加载的时候?

当然代码没有读,准备读。
5 楼 joachimz 2007-01-05  
stamen说的不错,关键是PropertyEditor不是线程安全的。因此defaultEditors没办法公用,只能每次创建。
不过从性能看,现代JVM创建小对象的代价非常非常小,在实际应用中,这点性能消耗不会成为瓶颈。
而且我以前也专门针对这个问题测试过,只是第一次load class会有较大的性能损耗(需要load很多PropertyEditor),后续创建一个BeanWrapperImpl的成本可以忽略不计。
4 楼 stamen 2007-01-05  
我今天再仔细看了一下,我想大概是这样的:
  
   属性编辑器因为需要保存转换过程中的状态,所以也不是线程安全的,所以Spring为每个Bean都提供一套属性编辑器。如果要使容器中所有Bean共享属性编辑器,就必须让编辑器内编辑对象的状态做到线程安全,如采用ThreadLocal,不过这样一来,编辑器的设计就比较复杂了。
   另外,我们可以知道IDE中的属性编辑器,是共享的,而非每个组件对应一套自己的编辑器实例,这是因为在开发时,属性编辑器没有线程安全问题,IDE一般就同时提供一个编辑窗口。而Spring容器的环境下,情况就复杂了,可能会有两个线程同时创建Bean,所以它对应的编辑器就得分家了。
3 楼 jamesby 2007-01-05  
恩,不过如果说是Rod的设计失误,我不赞同,说这句话之前先确认自己是否真正读懂了代码,我过两天也瞧瞧Spring启动过程的代码,共同学习。
2 楼 stamen 2007-01-04  
jamesby 写道
我没有看过源代码,乱说两句,之所以叫Wrapper,实际是一个包装,但是Bean是有状态的,所以Wapper是有状态的!如果无状态那叫BeanTools了

   Bean是有状态,但是属性编辑器是可以共用的,象目前的代码,每一个BeanWrapperImpl都对应一套独立的属性编辑器(如Integer.class 对应IntegerEditor,Boolean.class对应BooleanEditor),我觉得这些属性编辑器是容器级的,不应该放到BeanWrapperImpl,BeanWrapperImpl只需要引用到这些属性编辑器就可以了。这正是我疑问的地方。
1 楼 jamesby 2007-01-04  
我没有看过源代码,乱说两句,之所以叫Wrapper,实际是一个包装,但是Bean是有状态的,所以Wapper是有状态的!如果无状态那叫BeanTools了

相关推荐

    电改困惑:中国新能源并网为何难.pdf

    电改困惑:中国新能源并网为何难.pdf

    无穷的困惑:个体行为的基础是什么?.pptx

    无穷的困惑:个体行为的基础是什么?.pptx

    投资界的最大困惑:何处寻找未来的腾讯和阿里

    投资界的最大困惑:何处寻找未来的腾讯和阿里

    《C++程序设计》习题解答

    《C++程序设计》是一本深受程序员和计算机科学学生欢迎的经典教材,它深入浅出地介绍了C++这一...在解答过程中,遇到困难时,应当尝试自己分析问题,查阅相关资料,如果依然困惑,这些习题解答将成为宝贵的参考资源。

    软件设计师考试疑难问题解答

    《软件设计师考试疑难问题解答》是一本专门为准备软件设计师资格考试的考生编写的参考资料,以.pdg格式提供,旨在帮助考生解决在学习过程中遇到的困惑和难题。此书集成了软件设计领域的核心知识点,涵盖了考试的重点...

    案例分析(一):一个O2O产品经理的困惑.docx

    ### 案例分析:一个O2O产品经理的困惑 #### 一、产品背景与定位 **帮帮**是一款由58同城内部孵化的产品,它定位于个人服务交易的平台,提供诸如维修、宠物护理、摄影、职业咨询等多种服务。与58同城作为本地服务的...

    C# WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的。今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧。之前分享过一篇C#进阶系列——WebApi接口传参不再困惑:传参详解,这篇博文内容本身...

    ERP信息化建设中遇到的困惑解答

    ERP信息化建设中遇到的困惑解答

    用python计算lda语言模型的困惑度并作图

    LDA模型可以将文档表示为主题的混合体,每个主题是一个词的分布。该模型可以用于文档分类、主题分析、词语聚类等自然语言处理任务。 知识点三:计算困惑度的Python代码 该资源提供了计算困惑度的Python代码,包括...

    新闻写作的常见困惑及解答.zip

    首先,我们要了解新闻的五个W和一个H,即:Who(谁)、What(什么)、When(何时)、Where(何地)、Why(为什么)和How(如何)。这六个要素是构成新闻报道的基础,任何一篇新闻都应该清晰地回答这些问题,以便读者...

    物业管理中的四个困惑.docx

    【物业管理中的四个困惑】 物业管理作为现代城市生活的重要组成部分,它涉及到居民日常生活中的诸多方面,包括设施维护、环境管理、安全防护等。随着社会的发展,物业管理行业逐渐规范化,服务质量不断提升,但也...

    上海住宅景观设计困惑呼吁.docx

    上海住宅景观设计面临着一系列的困惑和问题,这些问题不仅关乎设计本身的质量,还直接影响到生态环境的保护和居民的...只有这样,才能真正实现经济、环境和社会效益的和谐统一,让每一个市民都能享受到绿色生活的关怀。

    打开困惑的钥匙

    通过实际观察,学生们不仅能解答课本上的问题,还能够学会如何将学到的知识应用到实际情境中去。 将上述知识点融入到生活实践中,意味着每个人都应培养对周围事物的好奇心,锻炼敏锐的观察力,并且在遇到问题时勇于...

    大班绘本:我不知道我是谁教案.docx

    【知识点】 这个文档是关于幼儿园大班的一...综上所述,这个教学活动不仅仅是讲述一个故事,更是一次寓教于乐的认知之旅,帮助幼儿在故事中探索自我,理解动物世界,同时也培养了他们的观察力、想象力和问题解决能力。

    数学教学中较困惑的几个问题.doc

    3. 应用题教学的困惑:应用题教学旨在培养学生的逻辑思维能力,但传统方法可能过于枯燥。新课改强调数学与生活的联系,因此教师应设计与生活贴近的应用题,同时兼顾基本的解题技巧训练。线段图、数量关系等是理解...

    破解内部审计的困惑与问题--课后测试.docx

    破解内部审计的困惑与问题是一份关于内部审计的课后测试,涵盖了内部审计的基础知识、审计模式、风险评估、内控要素、审计独立性等方面的知识点。本文将对这些知识点进行详细的解释和分析。 一、内部审计的基础知识...

    C++程序设计基础习题及解答共八章

    《C++程序设计基础习题及解答共八章》是一个针对C++初学者或准备C++考试者的宝贵资源。这份资料包含八章的习题和详细的解答,旨在帮助学习者巩固C++的基础知识,提高编程技能。以下是每章可能涵盖的知识点概览: 第...

Global site tag (gtag.js) - Google Analytics