## 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 來封裝業務邏輯,保存數據到數據庫, 像這樣:

其中 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 的思想:

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的時候,需要寫一堆與業務沒有關系的類。還需要被迫實現一些根本不應該實現的接口及其方法:

Spring 框架提供了一個Spring 容器來管理Bean
對于一個 Bean 來說,如果你依賴別的 Bean , 只需要聲明即可, spring 容器負責把依賴的 bean 給 “注入進去 “, 起初大家稱之為控制反轉 (IoC)
后來 Martin flower 給這種方式起來個更好的名字,叫 “依賴注入”。
如果一個 Bean 需要一些像事務,日志,安全這樣的通用的服務, 也是只需要聲明即可, spring 容器在運行時能夠動態的 “織入” 這些服務, 這叫 AOP