【Java核心技术】到底什么是JavaBean?

来源:互联网 发布:喜马拉雅朗读软件下载 编辑:程序博客网 时间:2024/06/09 15:16
作者:周邦涛(Timen)
Email:zhoubangtao@gmail.com
转载请注明出处:  http://blog.csdn.net/zhoubangtao/article/details/27102443

1. 简介

        到底什么是Bean?,网上给出各种解释,众说纷纭,那让我们先看一个官方定义和解释(参考自http://download.oracle.com/otn-pub/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/beans.101.pdf)

“A Java Bean is a reusable software component that can be manipulated visually in a builder tool.”(一个Java Bean是一个可以在构建工具中可视化操作的可重用软件组件)

2. 详解

        官方针对Java Bean的定义还做了更加详细的解释:

        这个定义涵盖了各种可能性,构建工具(也即IDE)可以包含网页构建工具,可视化应用程序构建工具,GUI应用构建工具,抑或是服务器应用构建工具等等。有时“构建工具”可能仅仅是个包含几个bean作为复合文档一部分的文档编辑器。

        有些Java Bean可能仅仅是个GUI元素,例如button和slider等。而有些Java Bean则可能是复杂的可视化软件组件,比如数据库查看器或者数据源,还有一些Java Bean可能并没有GUI外观,但是它依然能够通过一个应用构建工具可视化地组合在一起。

        有些构建工具可以完全可视化操作,实现Java Bean的直接插拔。也有一些构建工具能让用户很方便的写一些Java类去控制和交互Java Bean,然而还有一些构建工具可以提供一个简单的脚本语言从高层操作Java Bean。

        不同的Java Bean所提供的功能可能完全不同,但是有一些典型的统一特征去区分Java Bean:

  • 支持”内省(introspection)“,这样构建工具可以分析出这个bean是怎么工作的(也就是通过反射可以知道这个bean的属性,方法,事件等)。
  • 支持”定制化(customization)“,这样当用户使用应用程序构建工具的时候可以定制这个bean的外观和行为
  • 支持“事件(events)”,作为一个简单的消息传递,也就是说可以把多个bean通过events链接起来
  • 支持“属性(properties)”,用作定制化和编程
  • 支持“持久化(persistence)”,这样当一个bean在应用程序构建器中定制化之后,可以将其定制化状态保存起来,以便之后重新加载进去

        一个Java Bean不要求从任何特殊的基类或接口继承而来。但是可视化Bean必须继承java.awt.Component以便它能够被添加到一个可视化容器中,但是一个非可视的Bean就不需要做这些了。

        从上边的描述我们知道可视化的bean其实就是awt组件,官方文档还对非可视化bean做了描述:

        许多Java Bean都有GUI表示。当使用GUI应用程序构建工具组合bean的时候,这些bean将总是这样的GUI表示(可重用嘛!),这可能是Java Bean架构最明显,最令人信服的部分了。

        但是实现一些不可视化的bean(也就是没有GUI表示的)也是可能。这些bean依然能够调用方法,触发事件,保存状态等等。它们依然可以在GUI构建工具中使用标准的属性栏或者定制器去编辑、定制。它们只是没有屏幕展示而已。

        这些非可视化bean可以用作GUI应用的内部共享资源,也可以用作在构建根本没有GUI界面的服务器端应用程序中。

        这些非可视bean仍然可以在应用程序构建工具中可视化的呈现(也就是在应用开发时可以采用可视的图标等代表不可视的bean,这些bean只是在运行时不可视而已),它们还可以有GUI的定制器(其实就是我们在做GUI应用时的属性框)去定制这些bean的属性和表现。

        一些bean可以运行时可以有GUI外观,有时不具有GUI外观,这取决与他们初始化时的环境。所以如果一个bean跑在服务器上,那它就可以没有GUI界面,如果跑在用户桌面上它就可以有GUI界面。

3. 我要说

        官方解释中提到内省,其实内省就是要求Java Bean有一个无参构造函数、有属性、提供Setter和Getter等,可以通过反射机制获取Java Bean内部的属性、事件等,并在没有任何说明的情况下构造出Java Bean实例。

        不管是从Java Bean的定义还是从对定义的详细解释上看,Java Bean架构都是Java在awt界面开发时的产物,不管是可视化还是非可视化Java Bean,其实都是用在GUI应用程序开发的(翻看Java提供的各种帮助文档,tutorial或者是例子程序,你会发现无论是可视化还是非可视化的,它都在讲述GUI的例子)。Java Bean架构产生的目的就是要将awt技术推广成VS做界面开发一样的效果,实现可拖拽的操作方式。Java Bean可以在不同的GUI开发IDE之间重用,而表现出同样的外观。但是由于awt技术的性能低下、界面丑陋,而没有受到开发者的青睐。而Java Bean的可重用设计初衷还是不错了,所以Java Bean这个概念逐渐退化,退化为只要符合:有一个无参构造函数,提供属性的Setter和Getter方法便可以叫做Java Bean。于是Hibernate的Domain Model成了Java Bean,DTO/VO成了Java Bean。现在的Java Bean已经是范化了的Java Bean。如果你问我Hibernate的Domain Model到底是不是Java Bean,我会告诉你在awt盛行的时代,我不认为它是个Java Bean,但是在awt已经没落的现在,我会弱弱的告诉你它也算是。

4. 总结

        本文引用Java Bean的官方定义,阐述了Java Bean的官方解释。提出自己的一些看法,仅代表个人观点,但是无论你同不同意,或者自己理解的Java Bean到底是什么样子的,这都不影响你的编程能力。不过现在大家在说的Java Bean已经是范化了的Java Bean了。

5. 参考资料

  1. http://download.oracle.com/otn-pub/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/beans.101.pdf
  2. http://docs.oracle.com/javase/tutorial/javabeans/index.html
作者:周邦涛(Timen)
Email:zhoubangtao@gmail.com
转载请注明出处:  http://blog.csdn.net/zhoubangtao/article/details/27102443
0 0
原创粉丝点击