Java學習筆記-----中間件,組件,容器,框架的精彩理解

在現在企業級應用中,我們的應用軟件一般分爲三層
三層分別是表示層,業務邏輯層,數據持久層
------------------------------
|表示層|業務邏輯層|數據持久層|
------------------------------
我們來說說三層中的代表軟件
表示層
這一層一般在客戶端pc機上,最常見的是IE瀏覽器,這就是表示層的軟件
表示層是直接與使用者交互的軟件
業務邏輯層
這一層一般在服務器端,顧名思義,所有業務邏輯處理都在這一層完成
最典型的是appserver,比如IBM的websphere,BEA的weblogic還有tomcat/jboss等
這一層也是三層中的重點,我們要說的大部分內容都是關於這一層的,這個等會再說
這一層就叫做中間層
數據持久層
這一層典型的就是數據庫,一般也在服務器端
但該服務器一般與裝業務邏輯層軟件的服務器分開
當然你也可以用IO輸入輸出流往硬盤上寫東西
但沒人會建議你這麼做,因爲這樣做你的數據缺乏管理,不管怎樣
這一層要做的就是保存數據,業務邏輯層軟件一般不負責保留數據
或者說業務邏輯層只負責暫時儲存數據,一關機,業務邏輯層數據全部over了

那麼數據的持久化(也就是儲存數據)就必須要在這一層完成。


什麼是中間件,中間件是業務邏輯層的應用軟件
是處理業務數據與客戶端之間業務邏輯的一種應用軟件
一種提供網絡服務的服務器端應用軟件
舉個非常簡單的例子,網上銀行,某個人想用IE進入工行的賬戶,然後轉帳
在這個例子中,客戶端表示層顯然是IE,數據持久層顯然是銀行的核心數據庫
那麼中間件是什麼?中間件就是提供這種服務的系統。
這三層的劃分如下
------------------------------
|表示層 | 業務邏輯層 | 數據持久層 |
------------------------------
| IE | 網上銀行 | 數據庫 |
------------------------------


什麼是組件,組件是什麼?組件其實就是一個應用程序塊
但是它們不是完整的應用程序,不能單獨運行
就有如一輛汽車,車門是一個組件,車燈也是一個組件
但是光有車燈車門沒有用,它們不能跑上公路
在java中這些組件就叫做javabean,有點像微軟以前的com組件
要特別說明的是,由於任何一個java文件編譯以後都是以類的形式存在
所以javabean肯定也是一個類,這是毫無疑問的
好,那麼容器裏裝載的是什麼呢?就是這些組件
而容器之外的程序需要和這些組件交互必須通過容器
舉個例子,IE發送了一個請求給容器,容器通過調用其中的一個組件進行相關處理之後
將結果反饋給IE,這種與客戶端軟件交互的組件就叫做servlet
但是組件有很多種,那麼如何區分這些組件呢?
有多種管理辦法,比如同是同樣是servlet,有些是通過jsp生成的
而有些是開發人員自己寫的,那麼通過jsp生成的servlet集中放在一個地方
而開發人員自己寫的則需要在xml裏面配置一些基本的參數
同時,不同組件有可能還需要繼承一些特定的父類或者接口,這也是容器管理的需要
還有其他的一些組件,這裏就不一一說明舉例了
那麼容器有很多種,按照他們裝載的組件類型劃分
比如有裝ejb的ejb容器,有裝servlet與jsp還有靜態頁面的web容器等等
//這種只含有web容器的應用服務器也被叫做web服務器
當表示層的應用軟件通過網絡向appserver發送一個請求的時候
appserver自動找到相應容器中的組件,執行組件中的程序塊,把得到結果返還給客戶
而我們要做的事就是寫組件也就是javabean,然後放到appserver裏面去就可以了
至於怎樣與IE通訊,怎樣截獲網絡上的請求,怎樣控制對象的數量等等
這些繁瑣而無味的工作我們都不管,都由appserver去做吧,把注意力集中在業務邏輯上
appserver與其他相關軟件的關係如下圖:
-------------------------------------------------------
| 表示層 | 業務邏輯層 | 數據持久層 |
-------------------------------------------------------
| | ----------------- | |
| IE | | javabean | | |
| -> ----------------- -> DB |
| client <- appserver <- |
| |-------------------------| |
| | 虛擬機 | |
|--------------|-------------------------|------------|
| Windows | Linux/Saloris |LinuxSaloris|
|--------------|-------------------------|------------|
圖上可以看出:虛擬機負責處理中間件與操作系統之間的交互
appserver則負責組件的管理以及與其他兩層的業務交互
要說明的是上圖中還包含有應用程序客戶端容器(Application client container)
管理應用程序客戶端組件的運行,應用程序客戶端和它的容器運行在客戶機
這種情況比較複雜一般說的是兩個server之間的通訊
比如jsp/servlet容器在一個服務器上,而ejb容器在另外一個服務器上等等
這是分佈式操作系統大面積應用的基礎,這個以後再說
嗯,那麼話題再回到中間件上去,什麼是中間件?
appserver就是所謂的中間件,但是中間件不僅有appserver,還有其他的東西
換句話說,appserver只是中間件的一種
而關於中間件有諸多規範以及遵循這些規範的模型
最流行的規範無非兩種,一個是j2ee還有一個是.net
但是.net幾乎只有微軟在用,所以很多人把.net這個規範就當成是微軟的中間件產品
也不爲過,畢竟沒幾個公司喜歡跟着微軟屁股後面跑的。


容器從某種意義上說其實就是一個可運行的java寫的應用程序
猶如c++/c編譯後生成的.exe文件
不同的是java編譯後的文件需要用命令行或者腳本啓動執行
由於容器是由java寫的,所以容器都能夠跨平臺。


JDBC
和數據庫的連接
這個嚴格說來是數據庫產商需要關心的事
關於AppServer如何與數據庫的連接
但是也需要開發人員做一點事,因爲AppServer不知道什麼時候組件需要用到數據庫
同時也需要開發人員告訴AppServer他們使用的是什麼數據庫,ip地址等等
JDBC就是關於這一套東東的規範
包括數據庫的產商應提供什麼樣的接口
AppServer應用服務器應該如何去連接
開發人員應該如何去配置這些連接等等
還有一些數據源,連接池等概念參考相關數據在此就不再贅述
其它的規範比如JMX等確切地說與開發人員關聯並不大了
這類高級應用只對AppServer應用服務器產商重要。

Struts
表示層框架,名字來源於飛機的金屬框架
可能有讀者會提問了
表示層不是客戶端麼?
沒錯,但是語言這東西,衆口爍金,別人都這麼說你就不好不這麼說了
最早表示層說的是客戶端,後來隨着時間的發展
人們也把服務器端直接與客戶端//比如IE
打交道的那部分也稱爲表示層//JSP+Servlet

那麼表示層框架是幹什麼的呢?
早先大規模應用JSP的時候,人們發現,JSP裏面充斥着邏輯代碼與數據
可讀性極差,於是人們借用很早很早以前的MVC模式的思想
把表示層組件分爲V-Viewer,也就是JSP
M-Model模型,一般來說是一個JavaBean
C-Controller控制器,一般來說是一個Servlet
所有人通過JSP和服務器打交道,發送請求,Viewer把這個請求轉發給Controller
Controller通過調用一個Model來處理該請求,然後返回數據到Viewer
這麼一個過程,從而達到數據與邏輯的剝離,增強代碼可讀性,降低維護成本
而幫助人們實現這一系列東西的就是Struts框架,就是這麼一個東西
Struts的競爭對手主要是產商們極力倡導的JSF也就是Java Server Faces
但是由於Struts出道時間早,所以應用比較多
JSF則是產商們大力支持,前景看好
對於這一層來說,在JSP的html代碼中出現的java語句越少越好
因爲java代碼越少說明頁面處理的業務邏輯越少,也越合理
這也是Struts最初的目的,記住這話。


Spring 大名鼎鼎的Spring框架
有人曾說2005年一片叫春之聲,指的就是該框架
Spring起源於Rod Johnson的《Expert One-on-One J2EE Design and Development》一書
Rod Johnson認爲,J2ee裏面的那一套//尤其是ejb
太重了,對於單機的系統來說,沒有必要使用那麼複雜的東西
於是就開始設計並引導Spring小組開發出這樣一個構架
不能不說他是個天才,因爲的的確確不是所有的系統都是跨多服務器的
沒有必要把一個簡單的系統設計得那麼複雜//天才的那幾個共性又體現出來了
Spring從誕生之日起就是針對EJB的,力爭在不少應用上取代EJB
而它也確實達到了這個目的
現在包括WebLogic等主流應用服務器還有主流IDE都開始逐漸接受該框架
並提供相應支持
提到Spring就不能不說控制反轉Ioc//Inversion of Control
和依賴注射DI//Dependency Injection

什麼叫控制反轉呢?
套用好萊塢的一句名言就是:你呆着別動,到時我會找你。


Hibernate
名字取材自ORM最早的一句玩笑話//ORM就是OR-Mapping
說用了ORM之後,程序員就可以去冬眠了,而不需要操心那麼多事
這裏不得不說的是,該框架由於做得太好,以至於被J2ee招安,成爲EJB3.0的一部分
替代原有EJB2.X裏面關於Entity Bean而成爲EJB ORM的工具
這裏解釋一下ORM//OR-Mapping
中文名對象關係映射

什麼意思呢?我們知道傳統的數據庫都是關係型的
一條條記錄以表格的形式儲存,而表與表之間充斥着是關係/關聯
比如說一個人,名字zhaoce,性別男,年齡23那麼數據庫中是這麼儲存的
姓名 性別 年齡 zhaoce m 23 某女 f 22
而實際應用服務器中的實體都是以對象的形式存在,一個個對象
zhaoce是以這種形式存在的
Human human=new Human();
human.setName("zhaoce")
human.setSex("m");
human.setAge(23);
這樣的,那麼我們知道,傳統的JDBC是通過一個二維字符串將數據取出
需要我們自己將其包裝成對象,在存入的時候,我們還需要將對象拆開
放入sql語句中//Insert into Huamn values('zhaoce','m',23)
然後執行該sql語句
太麻煩太麻煩,ORM理念的提出改變了這一切,ORM認爲,這些東西應該由框架來做
而不是程序員,程序員做他該做的,不要爲這種破事分心,還測試半天
於是就出現了Hibernate,JDO,TopLink等等,甚至.net裏面也有ADO.net
過去一段時間是Hibernate和JDO爭風,現在看來Hibernate逐漸成爲主流並被官方接納
成爲規範標準之一,替代掉原來EJB2.X的ORM EntityBean
TopLink則是Oracle公司推出和Oracle數據庫結合的一種ORM
商業用軟件,貴且複雜,不過正在逐漸開放
而象表示層一樣,這一種專門面對數據層的代碼也被稱爲數據持久層
所以數據持久層這一概念有時不僅僅指代數據庫
關於ORM,最高的境界應該是在java代碼中不出現任何一句的sql語句
注意,是不包括sql語句,Hibernate的hql以及ejb的ejb-ql不算在內
至於出現不出現hql/ejb-ql等替代ql,這要視具體情況而定,不過最好也是不出現
當然最後所說的過分理想的情況往往不現實,總之一句話
以sql爲代表的ql/*還有hql,ejbql等*/語句在代碼中出現得越少越好
記住這話,現在未必能夠理解,學了以後就懂了
這三個是目前最爲常用的框架 而目前光已公佈的框架就>500
還在不停增加中,不可能一一列舉,有興趣的可以去看相應文檔 要指出的是框架不是應用程序
只是一堆組件的有序複合,應用時不能脫離於應用服務器單獨存在。


SOA
面向服務的構架
不說太多,這個屬於上上層建築
不過不妨記住我的一句話,可以幫助理解這個概念
面向什麼就是對什麼做封裝
面向對象就是對對象做封裝
面向服務類似,剩下的靠悟性。

反射
1.4新增功能,非常強大
通過反射,程序可以解析出類本身的屬性也就是變量
/注意這裏說的屬性不是.net裏面的屬性,我不喜歡微軟造的新名詞,亂
還有行爲也就是方法,然後通過invoke()方法調用該方法
甚至可以新增對象等,java首創,本是其它語言所沒有的
後來被微軟抄了去,利用該功能,開源框架廣泛受益並大量採用,近乎瘋狂地使用。


書籍
《Thinking in Java》 //實話說,一般,尤其是翻譯後的版本,原版還行
《Java教程》 //電子工業出版社出版的那本,上下冊,很厚,但翻譯得不錯
《21天學通Java》 //入門極好,但是《21天學通j2ee》極爛,不要買
《Mastering EJB》 //翻譯過的書質量我不清楚,估計不怎樣,請看原版書籍
《精通Hibernate》 //看清楚作者,孫衛琴,其它人的別買
其它的可以不用了,網絡上的遠比書上來得多,來得好,雖然也來得雜。
最後的建議
一,不要做一個浮躁的人
二,學好英語,很重要
三,閱讀源代碼和文檔
四,共享源代碼,不要做一個功利的人
五,熱愛Java。


文章出處:http://bbs.51cto.com/thread-1031231-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章