1. 程式人生 > >Java框架之Java Bean

Java框架之Java Bean

gmv 企業 意大利 new 持久化 servlet 工具 序列 type

鏈接 知乎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 (上)

前言: 最近看到到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(下)

上一篇提到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開發迅速的繁榮了。
我們再一次體會到了開放的好處 !



Java框架之Java Bean