Java框架之Java Bean

链接 知乎https://www.zhihu.com/question/19773379 总结

符合一定规范的编写的Java类,不是一种技术,而是一种规范。大家对于这种规范,总结了很多开发技巧,工具函数。

1、所有属性为private
2、提供默认构造方法
3、提供getter和setter
4、实现serializable接口

在java1996年发布,当年12月即发布了java bean1.00-A,有什么用呢?通过统一的规范可以设置对象的值(get,set方法),这是最初的java bean;

  • 在实际企业开发中,需要实现事务,安全,分布式,javabean就不好用了.sun公司就开始往上面堆功能,这里java bean就复杂为EJB;
  • EJB功能强大,但是太重了.此时出现DI(依赖注入),AOP(面向切面)技术,通过简单的java bean也能完成EJB的事情,这里的java bean简化为POJO;
  • Spring诞生了.
  • PO(persistence object):用于持久化时(例如保存到数据库或者缓存);
  • VO(value object):用于前端展示使用(例如放置到JSP中解析或者给前端传递数据)
  • DTO(data transfer object):用于接口互相调用返回,数据传输(例如很多接口调用返回值或消息队列内容);

主要区分三个:JavaBean,EJB,POJO。
JavaBean
JavaBean是公共Java类,但是为了编辑工具识别,需要满足至少三个条件:

  1. 有一个public默认构造器(例如无参构造器,)
  2. 属性使用public 的get,set方法访问,也就是说设置成private,同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){},N大写。
  3. 需要序列化。这个是框架,工具跨平台反映状态必须的

EJB
在企业开发中,需要可伸缩的性能和事务、安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系统。 然后有提高了协议要求,就出现了Enterprise Bean。
EJB在javabean基础上又提了一些要求,当然更复杂了。
POJO
有个叫Josh MacKenzie人觉得,EJB太复杂了,完全没必要每次都用,所以发明了个POJO,POJO是普通的javabean,什么是普通,就是和EJB对应的。
总之,区别就是,你先判断是否满足javabean的条件,然后如果再实现一些要求,满足EJB条件就是EJB,否则就是POJO。

Java语言欠缺属性、事件、多重继承功能。所以,如果要在Java程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码。Java Bean正是编写这套胶水代码的惯用模式或约定。这些约定包括getXxx、setXxx、isXxx、addXxxListener、XxxEvent等。遵守上述约定的类可以用于若干工具或库。

Java Bean的设计目的

1、紧凑方便地创建和使用

2、完全的可移植性

3、继承Java的强大功能

4、开发工具支持

5、分布式计算支持

Java Bean定义为“一种在开发工具中可视化操作的,可复用的,平台独立的软件组件“

Java Bean的特性

1、支持自检:构造器可以分析bean怎样工作;

2、支持定制:用户使用构造器工具定制bean的外观和行为;

3、支持事件处理:bean才能与外部进行通信;

4、支持属性:bean才能具有内容的状态,便于定制和应用开发;

5、支持永久性:bean才能在应用程序构造器工具中定制,并将定制的状态存储起来便于随时使用。

Java 帝国之Java bean (上)

原创 2016-05-27 刘欣 码农翻身

前言: 最近看到到spring 的bean 配置, 突然想到可能很多人不一定知道这个叫bean的东西的来龙去脉, 所以就写个文章来讲一下。
另外,上次出了开源中国抄袭事件, 为了防止转载以后我的公众号信息被故意删除, 我在文章的内容中加上了一些 刘欣(微信公众号:码农翻身) 这样的字样, 可能会造成一些烦扰, 请见谅。 我一手创立的Java帝国刚刚成立不久,便受到巨大的打击, 我派出去占领桌面开发的部队几乎全军覆没。 
情报说微软的Visual Basic 和Borland的Delphi最近在宣传什么组件化开发, 难道就是这东西把我们搞垮了? 
刘欣(微信公众号:码农翻身)注:参见《Java :一个帝国的诞生》和《Basic: 一个老兵的自述

我赶紧买了一个Visual Basic 过来研究, 果然,这个家伙确实是方便, 最让我惊叹的是:它有一个可视化编辑器 ! 
我只需要把一个组件(例如按钮)拖拽到可一个表单上,  设置一下属性 (颜色,字体), 再添加一个事件(onClick), 最后在onClick中写点代码就搞定了 !
不仅如此,我自己也可以把我的代码按规范包装成一个组件, 发布出去让别人使用。
我看着手下给我买来的《程序员大本营》光盘, 里边竟然包含了好几千个这样的组件, 有数据库浏览组件, 计时器组件, 颜色选取组件, 甚至还有收发邮件的组件......
天哪, 这以后开发桌面程序岂不太简单了 !
怪不得我的Java 被打得满地找牙!
刘欣(微信公众号:码农翻身)注: 90年代末的程序员和学生估计都知道《程序员大本营》, 由csdn的创始人蒋涛制作。
我赶紧打电话给我的干将小码哥 : 小码啊, 你赶紧看看这个Visual Basic 和Delphi , 给你7天时间, 我们Java 也得赶紧搞一套这样的东西出来。
小吗毫不含糊, 三天就给我搞了一个东西出来: Java Bean API 规范 。
我翻开一看, 哇塞, 长达114页 , 于是问他:“这是什么东西? 我要的可视化编辑器呢Visual Java 呢? ”
刘欣(微信公众号:码农翻身)注: 我下载浏览了java bean 的规范, 确实是114页
他说: “老大, 我们是个开源的社区, 得充分利用大家的力量, 所以我没有去做像VB和Delphi那样的东西, 相反,我定义了一套规范, 只要大家按照这个规范做, 谁都可以用java 做出像VB那样的可视化开发工具出来。”
“那你说说这个java bean 到底是什么规范?”我问。
“首先,一个java bean 其实就是一个普通的java 类, 但我们对这个类有些要求: 
1. 这个类需要是public 的, 然后需要有个无参数的构造函数
2. 这个类的属性应该是private 的, 通过setXXX()和getXXX()来访问
3. 这个类需要能支持“事件”, 例如addXXXXListener(XXXEvent e),  事件可以是Click事件,Keyboard事件等等, 当然咱们也支持自定义的事件。 
4. 我们得提供一个所谓的自省/反射机制, 这样能在运行时查看java bean 的各种信息“
5. 这个类应该是可以序列化的, 即可以把bean的状态保存的硬盘上, 以便以后来恢复。

“这些要求看起来也没啥啊,对程序员来说,不就是个普通的java 类吗? 到底该怎么用? ” 
“我们幻想一下,假设我们的Java bean 大行其道了, 有个用户在用一个Visual Java Builder  这样的可视化开发工具, 当他用这个工具创建应用的时候, 可以选择一个叫JButton的组件, 加到一个表单上, 此时Visual Java Builder 就需要把这JButton的类通过反射给new 出来, 所以就需要一个无参数的构造函数了。”
“如果用户想去设置一下这个JButton的属性,Visual Java Builder 就需要先用自省/反射来获取这个JButton有哪些属性(通过getter/setter), 拿到以后就可以给用户显示一个属性清单了, 例如背景色, 字体 等等。用户看到后就可以设置背景色和字体了,  此时Visual Java Builder 在内部就需要调用这个Bean的setBackgroundCorlor()/setFont() 等方法, 这就是所谓的setXXXX()方法。”
“如果用户想对这个JButton编程, Visual Java Builder 还是通过自省/反射来获取这个JButton有哪些事件, 给用户展示一个事件清单,例如click , keyboardPressed 用户可以选取一个, 然后就可以写程序对这个事件编程了。”
“可是那个序列化有什么用呢?”
“这是因为用户设计完了以后,可能关掉Visual Java Builder 啊 , 如果不通过序列化把设计好的JButton保存起来, 下次再打开Visual Java Builder , 可就什么都没有了”
我想了想, 小码哥设计的不错,仅仅用了一个简单的规范就满足了可视化编辑器的所有要求。

"那我们就发布这个规范吧, 咱们自己先做一个可视化编辑器,给别人做个榜样, 名称我都想好了, 叫NetBean吧。"
刘欣(微信公众号:码农翻身)注:这是我杜撰的, 实际上NetBean这个名称可能和java bean 并没有实际关联。

果然不出我们所料, Java bean 发布以后, 有力的带动了Java 的IDE市场,  开发Delphi的Borland公司 也来插了一脚,搞出了一个JBuilder, 风靡一时。 
IBM 搞了一个Visual Age for Java ,  后来摇身一变, 成了一个叫Eclipse的开放平台,超级受大家欢迎, 它反过头来把我们的Netbean 和 JBuilder 逼的快没有活路了。 
虽然我们玩的很欢,但是程序员根本不买账, Java 在桌面开发市场还是没有起色,使用Java bean 创建桌面程序的程序员少之又少, 只有部分像金融、ERP这样的领地还在坚持。   
看来是无药可救了。 
但是Java bean 何去何从 ? 丢弃掉太可惜了,   我和小码哥商量了一下, 我们觉得:既然我们Java在统治了服务器端的编程, 还是在那里想想办法吧......

Java 帝国之Java bean(下)

原创 2016-05-29 刘欣 码农翻身

上一篇提到Java bean 的规范虽然定义的不错, 但却没有获得意料中的成功, 尤其是Java帝国所期待的桌面开发组件化市场上。 
我和小码哥多么期待CSDN也能出一期《程序员大本营》, 里边包含成千上万的java bean 组件啊。
不要幻想了, 赶紧把java bean 应用在服务器端才是正事。 JSP + Java Bean小码哥建议先用在jsp上试试,  可以用java bean 来封装业务逻辑,保存数据到数据库, 像这样:(微信公众号"码农翻身"注: 这其实叫做JSP Model 1 )
其中jsp 直接用来接受用户的请求, 然后通过java bean 来处理业务, 具体的使用方法是:<jsp:useBean id="user" scope="page" class="com.coderising.User"/><jsp:setProperty property="userName" name="user" param="userName"/><jsp:setProperty property="password" name="user" param="password"/>
这就能把HTTP request中的所有参数都设置到 user 这个java bean 对应的属性上去。 
如果想偷懒, 还可以这样:
<jsp:setProperty name="user" property="*"/>
当然要保证 http request中的参数名和 java bean 中的属性名是一样的。 
这个叫做JSP Model 1 的模型受到了很多Java程序员的欢迎 ,  因为他们的应用规模都很小, 用Model 1 使得开发很快速。
实际上, 这种方式和微软帝国的asp , 以及和开源的php 几乎一样。 
但很快就有人来找我抱怨了, 说他们的项目中使用了Model 1 导致整个系统的崩溃。 
他说: “你知道吗? 我们的系统中有好几千个jsp, 这些jsp互相调用(通过GET/POST), 到了最后调用关系无人能搞懂。 ”
其实我们已经预料到了, 小码哥对此有个形象的比喻:意大利面条这几千个JSP 就像这碗面条一样,搅在一起, 根本理不清楚。
为了解决这个问题,小码哥又推出了 :JSP Model 2 ,    这是个模型真正的体现了Model-View-Controller的思想:Servlet 充当Controller ,  jsp 充当 View Java bean 当然就是Model 了!
业务逻辑, 页面显示, 和处理过程做了很好的分离。 
基于这个模型的扩展和改进,  很多Web开发框架开始如雨后春笋一样出现, 其中最著名的就是Struts, SpringMVC 了。
Java Web开发迅速的繁荣了。 
我们再一次体会到了开放的好处 !

时间: 2024-12-31 03:34:50

Java框架之Java Bean的相关文章

Java框架spring Boot学习笔记(十一):bean管理(注解和配置文件混合使用)

配置文件和注解混合使用 创建对象操作使用配置文件方式实现 注入属性的操作使用注解方式实现 编写BookDao.java和OrderDao.java文件 BookDao.java 1 package com.example.spring; 2 3 public class BookDao { 4 public void book(){ 5 System.out.println("Book Dao."); 6 } 7 } OrderDao.java 1 package com.exampl

atitit. groupby linq的实现(1)-----linq框架选型 java .net php

atitit.  groupby linq的实现(1)-----linq框架选型 java .net php 实现方式有如下 1. Dsl/ Java8 Streams AP ,对象化的查询api ,推荐 1 2. Linq::: like  sql 的dsl 1 1.1. linq4j (jdk6 ok,jdk7 编译错误,又马jar下载) 1 1.2. Quaere:Java上的LINQ(新不上sourcecode) 1 1.3. joSQL也是与Quaere类似的API 2 1.4. .n

java获取spring的bean

/** * 加载spring配置文件,提供getBean接口. * @author xiongzy * */ public final class BeanLocator { private static final Logger logger = Logger.getLogger(BeanLocator.class); /** * 单实例. */ private static BeanLocator instance = null; /** * 缺省配置文件名称. */ private sta

java使用泛型实现Bean类和Map的相互转换

java使用泛型实现Bean类和Map的相互转换,使用泛型可以这带来了很多好处: 首要就是类型安全, Java 程序的类型安全.通过知道使用泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中).       泛型允许编译器实施这些附加的类型约束.类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来.   将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性. 消除强制类型转换. 泛型的一个附带好处是,

dwr 框架 ,实现 ajax 的java 框架

1. 引入 dwr.jar 包 2. 配置web.xml 文件 ,拦截请求 <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> &l

java 异常问题 No bean named &#39;sessionFactory&#39; is defined 和 initialize a collection of role

关于java的"No bean named 'sessionFactory' is defined "  频繁的出现在与SHH框架中或是在与Sping+JPA底层使用了HIbernate annotation 的实现:出现异常的原因是找不到sessionFactory bean. 原因有如下: 1.在Many-to-one  或是many-to-many 时候 我们设置了fetchType="lazy" 延时加载.解决问题的方法在web.xml中,加入  openS

MVC模式下基于SSH三大框架的java web项目excel表格的导出(不依赖另外的jar包)

最近工作中碰到了需要将web页面的表格内容导出到excel表格并下载到本地的需求.以下是在利用网上资源.与同事探讨下,完成的代码. 首先我们需要有定义好的实体类.以下是截取了项目中用到的部分代码. 1 public class QyggDocuments implements java.io.Serializable { 2 3 private static final long serialVersionUID = -2543382529255041149L; 4 5 private Stri

Java框架之Struts2(六)

一.OGNL表达式语言 Ognl Object Graphic Navigation Language(对象图导航语言),它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能. 它使用相同的表达式去存取对象的属性 Struts 2 默认的表达式语言是 OGNL,原因是它相对其它表达式语言具有下面几大优势: 1.支持对象方法调用,如xxx.doSomeSp

Java框架之Spring(四)

本文主要讲述在Spring中 1 注解方式装配 2 以自动扫描把组件纳入spring容器中管理 3 面象切面编程-代理的jdk 版实现 4 使用 Cglib 生成代理 5 aop编程的一些概念 6 使用 Spring 创建代理对象(注解方式) 7 使用 Spring 创建代理对象(基于XML配置的方式) 8 关于Spring JDBC 一.注解方式装配 1) 导入jar包 2) 引入名称空间 Spring-context <beans xmlns="http://www.springfra