## Visual Basic
Visual Basic在搞组件化开发,它有一个可视化编辑器
只需要把一个组件(按钮)拖拽到表单上,设置一下属性(颜色),再添加一个事件,最后在onClick里面写点代码就可以了。
## Java Bean API
定义了一套规范, 只要大家按照这个规范做, 谁都可以用 java 做出像 VB 那样的可视化开发工具出来
一个 java bean 其实就是一个普通的 java 类, 但我们对这个类有些要求
* 类是public的,然后需要有个无参数的构造函数
* 属性是private的,通过设置setXXX(),getXXX()来访问
* 能支持事件,例如 addXXXXListener(XXXEvent e), 事件可以是 Click 事件,Keyboard 事件等等
* 提供应该 反射机制,这样可以查看java bean的各种信息
* 可以序列化,可以保存在硬盘上
可以幻想一下,
* 创建JButton
有个用户在用一个 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 用户可以选取一个, 然后就可以写程序对这个事件编程了
## JSP Model1
Java bean 的规范虽然定义的不错, 但却没有获得意料中的成功, 尤其是 Java 帝国所期待的桌面开发组件化市场上。
那么能不能把Java Bean用到服务器端呢?
可以用 java bean 来封装业务逻辑,保存数据到数据库, 像这样:
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180815085834.png?picgo)
其中 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="*"/>
```
这个叫做 JSP Model 1 的模型受到了很多 Java 程序员的欢迎 , 因为他们的应用规模都很小, 用 Model 1 使得开发很快速。
实际上, 这种方式和微软帝国的 asp , 以及和开源的 php 几乎一样。
## JSP Model2
系统中有好几千个 jsp, 这些 jsp 互相调用 (通过 GET/POST), 到了最后调用关系无人能搞懂。就想一碗面条,搅在一起,理不清楚
为了解决这个问题,小码哥又推出了 :JSP Model 2 , 这是个模型真正的体现了 Model-View-Controller 的思想:
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180815090214.png?picgo)
Servlet 充当 Controller , jsp 充当 View ,Java bean 当然就是 Model 了!
很多 Web 开发框架开始如雨后春笋一样出现, 其中最著名的就是 Struts, SpringMVC 了。
## 企业级Java Bean
新的需求出现:
* 分布式
* 安全
* 事务
* 高可用性
可以归结为:
程序员只想关注我们的业务逻辑, 我们不想, 也不应该由我们来处理‘低级’的事务, 多线程,连接池,以及其他各种各种的‘低级’API, 此外 Java 一定得提供集群功能, 这样我们的一台机器死机以后,整个系统还能运转。 ”
最终拿出了一个叫做 J2EE 的东西, 像 Java bean 一样, 这还是一个规范, 但是比 Java bean 复杂的多, 其中有:
* JDBC:Java的数据库连接
* JNDI:Java命名和目录接口,通过一个名称可以定位到一个数据源
* RMI:远程过程调用,让一个机器上的Java对象可以调用另一个机器上的Java对象。
* JMS:Java消息服务,可以使用消息队列了。
* JTA:Java事务管理,支持分布式事务,可以在访问、更新多个数据库的时候保证事务的,而且还是分布式的。
* EJB:Java Bean变成了Enterprise Java Bean
使用了 EJB, 你就可以把精力只放在业务上了, 那些烦人的事务管理, 安全管理,线程 统统交给容器(应用服务器)来处理吧。
只要你的应用服务器是由多个机器组成的集群, EJB 就可以无缝的运行在这个集群上, 你完全不用考虑一个机器死掉了应用该怎么办。我们都帮你搞定了。
使用 Session Bean , 可以轻松的处理你的业务。
使用实体 Bean (Entity bean) , 你和数据库打交道会变得极为轻松, 甚至 sql 都不用写了。
使用消息驱动 Bean(Message Driven bean) , 你可以轻松的和一个消息队列连接, 处理消息。
Weblogic , Websphere 等符合 J2EE 规范的应用服务器趁势而上
## Spring
程序员发现EJB用起来非常的繁琐和笨重,为了所谓的分布式,背上了沉重的枷锁。
实体 Bean 很快没人用了, 就连简单的无状态 Session bean 也被大家所诟病, 其中一条罪状就是 “代码的侵入性”。
在定义一个Session Bean的时候,需要写一堆与业务没有关系的类。还需要被迫实现一些根本不应该实现的接口及其方法:
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180815090909.png?picgo)
Spring 框架提供了一个Spring 容器来管理Bean
对于一个 Bean 来说,如果你依赖别的 Bean , 只需要声明即可, spring 容器负责把依赖的 bean 给 “注入进去 “, 起初大家称之为控制反转 (IoC)
后来 Martin flower 给这种方式起来个更好的名字,叫 “依赖注入”。
如果一个 Bean 需要一些像事务,日志,安全这样的通用的服务, 也是只需要声明即可, spring 容器在运行时能够动态的 “织入” 这些服务, 这叫 AOP