首页 > 代码库 > JavaBeans wiki 摘译

JavaBeans wiki 摘译

鉴于Spring的beans包遵守JavaBean specs,有必要认真研究下JavaBean specs。

先看看wiki上是怎么说的:

定义

Java平台下,JavaBeans是那些将很多object包含进一个单独object的类,这个单独的object就是bean。JavaBeans的特点:serializable、无参构造、setter/getter properties。

优点:

  • bean的properties、events、methods可控。
  • bean可以注册接收其他objects的events;可以生成events发送给其他objects。
  • 可以提供辅助软件来configure一个bean。
  • bean的configuration settings能够被持久化、被还原。

缺点:

  • 无参构造的类被实例化时的状态是无效的。developer可能无法意识到不正常的实例化。
  • JavaBeans都是可修改的,所以不具备不可修改对象的优点。
  • 必须创建很多setter/getter,导致大量呆板的代码。

JavaBeans API

JavaBean的功能是由 java.beans 包 中的类和接口提供的。

接口描述
AppletInitializer用于初始化同时是applets的Beans。
BeanInfo允许设计者详细描述关于一个Bean的events、methods还有properties的信息。
Customizer允许设计者提供GUI,可以configure a bean。
DesignMode决定一个bean是否正在design mode下执行。
ExceptionListener发生异常时,该接口的一个方法会被调用。
PropertyChangeListener当一个bound property被改变时,该接口的一个方法会被调用。
PropertyEditor该接口的实现允许设计者修改和显示property values。
VetoableChangeListener当一个Constrainted property被改变时,该接口的一个方法会被调用。
Visibility该接口中的方法允许bean在GUI不可用的环境下执行。

注:bound property和constrainted property,详见 properties 。

 

JavaBeans conventions (惯例)

  • 类必须有一个public的无参构造。
  • 类的properties必须能通过get/set访问。—boolean properties可以通过is访问。
  • 类必须是serializable。

代码示例:

技术分享
 1 package player; 2  3 public class PersonBean implements java.io.Serializable { 4  5     /** 6      * Property <code>name</code> (note capitalization) readable/writable. 7      */ 8     private String name = null; 9 10     private boolean deceased = false;11 12     /** No-arg constructor (takes no arguments). */13     public PersonBean() {14     }15 16     /**17      * Getter for property <code>name</code>18      */19     public String getName() {20         return name;21     }22 23     /**24      * Setter for property <code>name</code>.25      * @param value26      */27     public void setName(final String value) {28         name = value;29     }30 31     /**32      * Getter for property "deceased"33      * Different syntax for a boolean field (is vs. get)34      */35     public boolean isDeceased() {36         return deceased;37     }38 39     /**40      * Setter for property <code>deceased</code>.41      * @param value42      */43     public void setDeceased(final boolean value) {44         deceased = value;45     }46 }
View Code

简单测试:

技术分享
 1 import player.PersonBean; 2  3 /** 4  * Class <code>TestPersonBean</code>. 5  */ 6 public class TestPersonBean { 7     /** 8      * Tester method <code>main</code> for class <code>PersonBean</code>. 9      * @param ARGS10      */11     public static void main(String[] args) {12         PersonBean person = new PersonBean();13 14         person.setName("Bob");15         person.setDeceased(false);16 17         // Output: "Bob [alive]"18         System.out.print(person.getName());19         System.out.println(person.isDeceased() ? " [deceased]" : " [alive]");20     }21 }
View Code

JSP 中的使用:

技术分享
 1 <% // Use of PersonBean in a JSP. %> 2 <jsp:useBean id="person" class="player.PersonBean" scope="page"/> 3 <jsp:setProperty name="person" property="*"/> 4  5 <html> 6     <body> 7         Name: <jsp:getProperty name="person" property="name"/><br/> 8         Deceased? <jsp:getProperty name="person" property="deceased"/><br/> 9         <br/>10         <form name="beanTest" method="POST" action="testPersonBean.jsp">11             Enter a name: <input type="text" name="name" size="50"><br/>12             Choose an option:13             <select name="deceased">14                 <option value="false">Alive</option>15                 <option value="true">Dead</option>16             </select>17             <input type="submit" value="Test the Bean">18         </form>19     </body>20 </html>
View Code

 

参考链接:

  • Oracle‘s JavaBeans tutorials
  • JavaBeans specification

JavaBeans wiki 摘译