Beans在功能和用途上應(yīng)用很廣。比如說(shuō),以下項(xiàng)都用到了beans:
圖形化用戶(hù)接口(GUI)
非可視化beans,比如拼寫(xiě)檢測(cè)器
別的類(lèi)型,比如applets
JavaBean規(guī)范
一個(gè)JavaBean其實(shí)就是一個(gè)Java類(lèi)。JavaBeans API規(guī)范書(shū)中針對(duì)它的方法和屬性定義了一個(gè)簡(jiǎn)單的規(guī)范,你必須在Java類(lèi)中用這些方法和屬性,否則就不能成為一個(gè)JavaBean。Bean的特征(也就是屬性、方法、事件)都應(yīng)能被帶有bean的應(yīng)用程序發(fā)現(xiàn),或者被IDE應(yīng)用程序發(fā)現(xiàn),比如IBM Eclispse或Intellij IDEA。這種發(fā)現(xiàn)過(guò)程被稱(chēng)之為內(nèi)省(introspection)。
Beans以以下二種方式支持內(nèi)省(introspection):
它們根據(jù)特定的規(guī)則也就是熟知的設(shè)計(jì)模式來(lái)命名特征。Java.bean.Introspector類(lèi)通過(guò)檢查設(shè)計(jì)模式來(lái)發(fā)現(xiàn)bean特征。Java.beans.Introspector類(lèi)依賴(lài)核心的Java反射API。
它們利用一個(gè)相關(guān)聯(lián)的bean信息類(lèi)來(lái)顯式提供屬性、方法和事件信息,這個(gè)類(lèi)實(shí)現(xiàn)BeanInfo接口,它能顯式的提供給那些應(yīng)用程序創(chuàng)建工具(Builder Tool)要用到的特征。
屬性是bean的外觀和行為的特征,你可以在設(shè)計(jì)的時(shí)候修改。Bean Builder工具通過(guò)內(nèi)?。╥ntrospection)發(fā)現(xiàn)它的屬性并提供給外部用于處理。Bean對(duì)外提供屬性的操作,所以它們能在設(shè)計(jì)的時(shí)候來(lái)定制。定制有二種方式:一是通過(guò)使用屬性編輯器,另外一個(gè)是通過(guò)使用功能更強(qiáng)大的bean定制器。
Beans使用事件與其他beans進(jìn)行通信。接受事件的bean(監(jiān)聽(tīng)bean)和激活事件的bean(源bean)通過(guò)注冊(cè)聯(lián)系起來(lái)。Bean Builder工具能檢測(cè)一個(gè)bean并判斷哪個(gè)beans能激活事件(發(fā)送),哪個(gè)能處理事件(接收)。
持久性(Persistence)確保beans能保存和恢復(fù)它們的狀態(tài)。修改一個(gè)bean的屬性后,你可以保存bean的狀態(tài)并能在以后恢復(fù)到未改變時(shí)的狀態(tài)。JavaBean體系結(jié)構(gòu)利用Java對(duì)象序列化來(lái)支持持久性。Bean的方法和java的方法沒(méi)有區(qū)別,你也可以從別的beans或者一個(gè)腳本環(huán)境中去調(diào)用這些方法。缺省情況下,所有public方法都是對(duì)外可調(diào)用的。
為了確保一個(gè)java類(lèi)成為JavaBean,有以下四個(gè)簡(jiǎn)單的也是必須的規(guī)范:
這個(gè)類(lèi)是可序列化的(能夠持久保存也能恢復(fù)狀態(tài)),也就是,它必須實(shí)現(xiàn)java.io.Serializable接口。
這個(gè)類(lèi)必須帶有一個(gè)無(wú)參數(shù)的構(gòu)造方法。
這個(gè)類(lèi)的屬性必須通過(guò)使用get、set和其他按標(biāo)準(zhǔn)命名規(guī)范來(lái)命名的方法來(lái)操作:getProperty()和setProperty()用于非布爾屬性,isProperty()用于布爾屬性。這些方法稱(chēng)之為getters和setters
這個(gè)類(lèi)包含所有必須的事件處理方法。
大部分JavaGUI工具包(AWT,Swing和SWT)的組件都使用JavaBeans規(guī)范。這樣保證GUI的編輯器比如Eclipse Visual Editor或者別的Java IDE來(lái)維持組件的層次結(jié)構(gòu),并通過(guò)getters和setters來(lái)訪問(wèn)它們的屬性。
JavaBeans事件和監(jiān)聽(tīng)器
一個(gè)事件集定義一種事件,包括它通信什么,需要產(chǎn)生什么和監(jiān)聽(tīng)事件是什么。一個(gè)事件集由以下幾部分組成:
事件監(jiān)聽(tīng)器接口
這個(gè)接口定義一個(gè)或多個(gè)方法,這些方法必須通過(guò)一個(gè)希望接收這種事件的類(lèi)來(lái)實(shí)現(xiàn)。這些方法通常需要一個(gè)或多個(gè)參數(shù),包括事件對(duì)象。
事件對(duì)象
事件對(duì)象從事件源傳到監(jiān)聽(tīng)器。包括所有必須的參數(shù),這些參數(shù)能被監(jiān)聽(tīng)器得到,包括事件源的起點(diǎn)。所有事件都是源自java.util.EventObject類(lèi)
事件注冊(cè)方法,包括add<Event>Listener() 和remove<Event>Listener(),允許一個(gè)組件管理所有已注冊(cè)對(duì)這個(gè)特定事件感興趣的組件。這個(gè)方法就一個(gè)參數(shù),也就是對(duì)這個(gè)事件感興趣的對(duì)象。這個(gè)對(duì)象必須實(shí)現(xiàn)<Event>監(jiān)聽(tīng)器接口。
Java.awt包提供許多預(yù)定義好的事件集,例如焦點(diǎn)事件、鼠標(biāo)事件、鼠標(biāo)移動(dòng)事件、鍵盤(pán)事件等等。這些事件集都包含了<Event>監(jiān)聽(tīng)器接口和事件對(duì)象。
比如,我們用鍵盤(pán)事件為例。鍵盤(pán)事件集包括KeyListener接口(這個(gè)接口定義了keyPressed(),keyReleased()和keyTyped方法)與KeyEvent類(lèi)。任何要產(chǎn)生鍵盤(pán)事件的組件都必須定義addKeyListener()和removeKeyListener()注冊(cè)方法。我們可以注意到對(duì)于key事件的命名模版的規(guī)范:事件名Key出現(xiàn)在監(jiān)聽(tīng)器接口、方法(可選)、事件對(duì)象和注冊(cè)方法中。你可以使用相同的命名規(guī)范給你自己創(chuàng)建的所有事件集命名。
預(yù)定義事件集(比如key事件集)通常對(duì)于你的開(kāi)發(fā)需要已經(jīng)足夠了。然而,你也可以創(chuàng)建你自己定義的事件集,只要你想要。
假如你想讓你的一個(gè)組件產(chǎn)生事件,你必須定義事件集、事件對(duì)象、事件注冊(cè)方法,這樣別的已經(jīng)注冊(cè)對(duì)這個(gè)事件感興趣的組件能夠在事件激發(fā)后被通知到。