什么是Bean?

一个Bean 就是一个类。我们不必为制造任何的Bean而编写一些特殊的代码或者使用特殊的编程语言。事实上,我们唯一需要做的是略微地修改我们对我们方法命名的办法。方法名通知应用程序构建工具是否是一个属性,一个事件或是一个普通的方法。

在Java 的文件中,命名规则被错误地曲解为“设计范式”。这十分的不幸,因为设计范式惹来不少的麻烦。命名规则不是设计范式,它是相当的简单:

(1) 因为属性被命名为xxx,我们代表性的创建两个方法:getXxx()和setXxx()。注意get 或set 后的第一个字母大写以产生属性名。“get”和“set”方法产生同样类型的自变量。“set”和“get”的属性名和类型名之间没有关系。

(2) 对于布尔逻辑型属性,我们可以使用上面的“get”和“set”方法,但我们也可以用“is”代替“ get”。

(3) Bean 的普通方法不适合上面的命名规则,但它们是公用的。

(4) 对于事件,我们使用“listener(接收器)”方法。这种方法完全同我们看到过的方法相同:

(addFooBarListener(FooBarListener)和removeFooBarListener(FooBarListener)方法用来处理FooBar 事件。大多数时候内建的事件和接收器会满足我们的需要,但我们可以创建自己的事件和接收器接口。

上面的第一点回答了一个关于我们可能注意到的从Java 1.0 到Java 1.1 的改变的问题:一些方法的名字太过于短小,显然改写名字毫无意义。现在我们可以看到为了制造Bean 中的特殊的组件,大多数的这些修改不得不适合于“get”和“set”命名规则。

Bean代码示例:

 //: Frog.java
// A trivial Java Bean
package frogbean;
import java.awt.*;
import java.awt.event.*;
class Spots {}
public class Frog {
private int jumps;
private Color color;
private Spots spots;
private boolean jmpr;
public int getJumps() { return jumps; }
public void setJumps(int newJumps) {
jumps = newJumps;
}
public Color getColor() { return color; }
public void setColor(Color newColor) {
color = newColor;
}
public Spots getSpots() { return spots; }
public void setSpots(Spots newSpots) {
spots = newSpots;
}
public boolean isJumper() { return jmpr; }
public void setJumper(boolean j) { jmpr = j; }
public void addActionListener(
ActionListener l) {
//...
}
public void removeActionListener(
ActionListener l) {
// ...
}
public void addKeyListener(KeyListener l) {
// ...
}
public void removeKeyListener(KeyListener l) {
// ...
}
// An "ordinary" public method:
public void croak() {
System.out.println("Ribbet!");
}
} //

首先,我们可看到Bean 就是一个类。通常,所有我们的字段会被作为专用,并且可以接近的唯一办法是通过方法。紧接着的是命名规则,属性是jump,color,jumper,spots(注意这些修改是在第一个字母在属性名的情况下进行的)。虽然内部确定的名字同最早的三个例子的属性名一样,在jumper 中我们可以看到属性名不会强迫我们使用任何特殊的内部可变的名字(或者,真的拥有一些内部的可变的属性名)。Bean 事件的句柄是ActionEvent 和KeyEvent ,这是根据有关接收器的“add”和“remove”命名方法得出的。最后我们可以注意到普通的方法croak()一直是Bean 的一部分,仅仅是因为它是一个公共的方法,而不是因为它符合一些命名规则。

用I n t r o s p e c t o r 提取B e a n I n f o

 //: BeanDumper.java

 // A method to introspect a Bean

 import java.beans.*;

 import java.lang.reflect.*;

 public class BeanDumper {

 public static void dump(Class bean){

 BeanInfo bi = null;

 try {

 bi = Introspector.getBeanInfo(

 bean, java.lang.Object.class);

 } catch(IntrospectionException ex) {

 System.out.println("Couldn't introspect " +

 bean.getName());

 System.exit(1);

 }

 PropertyDescriptor[] properties =

 bi.getPropertyDescriptors();

 for(int i = 0; i < properties.length; i++) {

 Class p = properties[i].getPropertyType();

 System.out.println(

 "Property type:\n " + p.getName());

 System.out.println(

 "Property name:\n " +

 properties[i].getName());

 Method readMethod =

 properties[i].getReadMethod();

 if(readMethod != null)

 System.out.println(

 "Read method:\n " +

 readMethod.toString());

 Method writeMethod =

 properties[i].getWriteMethod();

 if(writeMethod != null)

 System.out.println(

 "Write method:\n " +

 writeMethod.toString());

 System.out.println("====================");

 }

 System. out.println("Public methods:");

 MethodDescriptor[] methods =

 bi.getMethodDescriptors();

 for(int i = 0; i < methods.length; i++)

 System.out.println(

 methods[i].getMethod().toString());

 System.out.println("======================");

 System.out.println("Event support:");

 EventSetDescriptor[] events =

 bi.getEventSetDescriptors();

 for(int i = 0; i < events.length; i++) {

 System.out.println("Listener type:\n " +

 events[i].getListenerType().getName());

 Method[] lm =

 events[i].getListenerMethods();

 for(int j = 0; j < lm.length; j++)

 System.out.println(

 "Listener method:\n " +

 lm[j].getName());

 MethodDescriptor[] lmd =

 events[i].getListenerMethodDescriptors();

 for(int j = 0; j < lmd.length; j++)

 System.out.println(

 "Method descriptor:\n " +

 lmd[j].getMethod().toString());

 Method addListener =

 events[i].getAddListenerMethod();

 System.out.println(

 "Add Listener Method:\n " +

 addListener.toString());

 Method removeListener =

 events[i].getRemoveListenerMethod();

 System.out.println(

 "Remove Listener Method:\n " +

 removeListener.toString());

 System.out.println("====================");

 }

 }

 // Dump the class of your choice:

 public static void main(String[] args) {

 if(args.length < 1) {

 System.err.println("usage: \n" +

 "BeanDumper fully.qualified.class");

 System.exit(0);

 }

 Class c = null;

 try {

 c = Class.forName(args[0]);

 } catch(ClassNotFoundException ex) {

 System.err.println(

 "Couldn't find " + args[0]);

 System.exit(0);

 }

 dump(c);

 }

 } ///:

  

BeanDumper.dump()是一个可以做任何工作的方法。首先它试图创建一个BeanInfo 对象,如果成功地调用BeanInfo 的方法,就产生关于属性、方法和事件的信息。在Introspector.getBeanInfo()中,我们会注意到有一个另外的自变量。由它来通知Introspector 访问继承体系的地点。在这种情况下,它在分析所有对象方法前停下,因为我们对看到那些并不感兴趣。因为属性,getPropertyDescriptors()返回一组的属性描述符号。对于每个描述符号我们可以调用getPropertyType()方法彻底的通过属性方法发现类的对象。这时,我们可以用getName()方法得到每个属性的假名(从方法名中提取),getname()方法用getReadMethod()和getWriteMethod()完成读和写的操作。最后的两个方法返回一个可以真正地用来调用在对象上调用相应的方法方法对象(这是映象的一部分)。对于公共方法getMethodDescriptors( )返回一组方法描述字符。每一个我们都可以得到相当的方法对象并可以显示出它们的名字。对于事件而言,getEventSetDescriptors()返回一组事件描述字符。它们中的每一个都可以被查询以找出接

收器的类,接收器类的方法以及增加和删除接收器的方法。BeanDumper 程序打印出所有的这些信息。

如果我们调用BeanDumper 在Frog 类中,就像这样:

java BeanDumper frogbean.Frog

它的输出结果如下(已删除这儿不需要的额外细节):

 class name: Frog

 Property type:

 Color

 Property name:

 color

 Read method:

 public Color getColor()

 Write method:

 public void setColor(Color)

 ====================

 Property type:

 Spots

 Property name:

 spots

 Read method:

 public Spots getSpots()

 Write method:

 public void setSpots(Spots)

 ====================

 Property type:

 boolean

 Property name:

 jumper

 Read method:

 public boolean isJumper()

 Write method:

 public void setJumper(boolean)

 ====================

 Property type:

 int

 Property name:

 jumps

 Read method:

 public int getJumps()

 Write method:

 public void setJumps(int)

 ====================

 Public methods:

 public void setJumps(int)

 public void croak()

 public void removeActionListener(ActionListener)

 public void addActionListener(ActionListener)

 public int getJumps()

 public void setColor(Color)

 public void setSpots(Spots)

 public void setJumper(boolean)

 public boolean isJumper()

 public void addKeyListener(KeyListener)

 public Color getColor()

 public void removeKeyListener(KeyListener)

 public Spots getSpots()

 ======================

 Event support:

 Listener type:

 KeyListener

 Listener method:

 keyTyped

 Listener method:

 keyPressed

 Listener method:

 keyReleased

 Method descriptor:

 public void keyTyped(KeyEvent)

 Method descriptor:

 public void keyPressed(KeyEvent)

 Method descriptor:

 public void keyReleased(KeyEvent)

 Add Listener Method:

 public void addKeyListener(KeyListener)

 Remove Listener Method:

 public void removeKeyListener(KeyListener)

 ====================

 Listener type:

 ActionListener

 Listener method:

 actionPerformed

 Method descriptor:

 public void actionPerformed(ActionEvent)

 Add Listener Method:

 public void addActionListener(ActionListener)

 Remove Listener Method:

 public void removeActionListener(ActionListener)

 ====================

这个结果揭示出了Introspector 在从我们的Bean 产生一个BeanInfo 对象时看到的大部分内容。我们可注意到属性的类型和它们的名字是相互独立的。请注意小写的属性名。(当属性名开头在一行中有超过不止的大写字母,这一次程序就不会被执行。)并且请记住我们在这里所见到的方法名(例如读和与方法)真正地从一个可以被用来在对象中调用相关方法的方法对象中产生。通用方法列表包含了不相关的事件或者属性,例如croak()。列表中所有的方法都是我们可以有计划的为Bean 调用,并且应用程序构建工具可以选择列出所有的方法,当我们调用方法时,减轻我们的任务。最后,我们可以看到事件在接收器中完全地分析研究它的方法、增加和减少接收器的方法。基本上,一旦我们拥有BeanInfo ,我们就可以找出对Bean 来说任何重要的事物。我们同样可以为Bean 调用方法,即使我们除了对象外没有任何其它的信息(此外,这也是映象的特点)。

参考书:《Java编程思想第四版》

关于Bean的更多相关文章

  1. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  2. Spring中Bean的实例化

                                    Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...

  3. 基于注解的bean配置

    基于注解的bean配置,主要是进行applicationContext.xml配置.DAO层类注解.Service层类注解. 1.在applicationContext.xml文件中配置信息如下 &l ...

  4. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  5. Spring Bean详细讲解

    什么是Bean? Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象. Spring 容器会自动完成@bean对象的实例化. 创建应用对象之间的协作关系的行为称为:装配( ...

  6. 【解决方案】 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userHandler': Injection of resource dependencies failed;

    一个错误会浪费好多青春绳命 鉴于此,为了不让大家也走弯路,分享解决方案. [错误代码提示] StandardWrapper.Throwableorg.springframework.beans.fac ...

  7. 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。

    转载麻烦声明出处:http://www.cnblogs.com/linguanh/ 目录: 1,前序 2,作用 3,特点 4,代码 1,前序  在开发过程中,client 和 server 数据交流一 ...

  8. Spring Bean的生命周期(非常详细)

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  9. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  10. [spring]03_装配Bean

    3.1 JavaBean 3.1.1 JavaBean 是什么 JavaBean 是一种JAVA语言写成的可重用组件. 为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器. Jav ...

随机推荐

  1. 自动化测试LoadRunner

    这个地址应该比较的好下载,以前找的地址都是需要输入一些相关的信息.这个只需要有一个HP的注册账号就可下载,记下来.以备后用: 下载地址: http://www8.hp.com/us/en/softwa ...

  2. CMS 垃圾回收日志

    CMS 垃圾回收日志 https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs http://www.blogjava.net/D ...

  3. 使用JAVA直观感受快速排序与冒泡排序的性能差异

    初学算法,肯定会编写排序算法 其中两个最为有名的就是冒泡排序和快速排序 理论上冒泡排序的时间复杂度为O(N^2),快速排序的时间复杂度为O(NlogN) 下面本门使用JAVA,分别编写三段排序程序 对 ...

  4. UVa 10905 Children's Game

    注意!这不是单纯的字典序排序,比如90.9,应该是990最大 对字符串排序蛋疼了好久,因为别人说string很慢,所以一直没有用过. 看别人用string还是比较方便的,学习一下 对了,这里的cmp函 ...

  5. 【转】Windows Server 2008 以上服务器配置SMTP

    建立 SMTP 伺服器 [除非特別說明,否則本主題中的內容適用於 BizTalk Server 2013 和 2013 R2.]原文链接:https://msdn.microsoft.com/zh-t ...

  6. c#Winform程序,让pictureBox显示图像(包含GIF),并且不被占用,能即时删除图片。

    最近在做一个图片浏览的工具, 需要在PictureBox中显示图像文件, 包括gif播放.  且不能被程序独占, 就算winform的程序正在显示这张图, 也能在资源管理器里delete它. 看了看网 ...

  7. 在Datatables中加入错误提示功能

    经常用Datatables的童鞋一定碰到过当采用服务端请求的时候,一旦后台出现异常,Datatables的会一直卡在那里,中间的正在处理的提示一直停留着. 为了能给用户更好的体验,需要对Datatab ...

  8. ubuntu下安装Matlab

    (注:本文部分内容转自互联网) 一. 安装程序Step 1:下载matlab的安装文件至主目录下,讲matlab文件重命名为Mathworks.Matlab.R2012a.Unix.isoStep 2 ...

  9. A. Puzzles CodeForces Round #196 (Div.2)

    题目的大意是,给你 m 个数字,让你从中选 n 个,使得选出的数字的极差最小. 好吧,超级大水题.因为要极差最小,所以当然想到要排个序咯,然后去连续的 n 个数字,因为数据不大,所以排完序之后直接暴力 ...

  10. JVM——垃圾收集算法

    1.标记-清除算法 最基础的收集算法,如其名,算法为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 两个不足: 1)效率问题,标记和清除两个过程的效率 ...