一個牛人給java初學者的建議

来源:http://www.cnblogs.com/shouce/archive/2016/05/27/5533343.html
-Advertisement-
Play Games

給初學者之一:淺談java及應用學java 不知不覺也已經三年了 從不知java為何物到現在一個小小的j2ee項目經理雖說不上此道高手,大概也算有點斤兩了吧每次上網,泡bbs逛論壇,沒少去java相關的版面總體感覺初學者多,高手少,精通的更少由於我國高等教育制度教材陳舊,加上java自身發展不過十年 ...


給初學者之一:淺談java及應用學java

不知不覺也已經三年了

從不知java為何物到現在一個小小的j2ee項目經理雖說不上此道高手,大概也算有點斤兩了吧每次上網,泡bbs逛論壇,沒少去java相關的版面總體感覺初學者多,高手少,精通的更少由於我國高等教育制度教材陳舊,加上java自身發展不過十年左右的時間還有一個很重要的原因就是java這門語言更適合商業應用所以高校里大部分博士老師們對此語言的瞭解甚至不比本科生多在這種環境下,很多人對java感到茫然,不知所措,不懂java能做什麼即便知道了java很有用,也不清楚該從哪裡入手所以就有了 java入門難 這一說法ok,那我們就從java到底能做什麼聊起

先說什麼是java
java是一種面向對象語言,真正的面向對象,任何函數和變數都以類(class)封裝起來
至於什麼是對象什麼是類,我就不廢話了
關於這兩個概念的解釋任何一本面向對象語言的教材裡面都有
知道了什麼是java,那自然就會對java能幹什麼感興趣

在說java能做什麼之前,先說java作為一個真正面向對象語言的優點

首先第一個,既然是真正的面向對象,那就要做到徹底的封裝

這是java和c++最大的不同,java所有的源碼以及編譯後的文件都以類的形式存在
java沒有所謂的類外部定義,所有的函數(方法)以及變數(屬性)都必須在類內部定義
這樣就不會出現一個類被切割成這裡一塊那裡一塊的情況,c++就可以,不是麽?
這樣做使得整個程式的結構異常清晰,明瞭

其次第二個,最讓人歡呼雀躍的是完全屏蔽了指針,同時引入了垃圾回收機制

任何一個寫過c/c++代碼的人,都會對記憶體管理深惡痛絕
因為這使得我們不能把主要精力放在我們關心的事情上
而需要考慮電腦內部的一些事情,作為一個軟體工程師
我想沒有一個人願意把大量的時間花在記憶體管理上,畢竟我們不是電子工程師
此時java的優勢體現出來了,它完全屏蔽了記憶體管理
也就是說,如果你用java寫程式,寫出來的任何一個程式記憶體上的開銷,都不受你控制
乍一看,似乎你受到了束縛,但實際上不是這樣
因為雖然你的程式無法對記憶體進行管理,降低了一定的速度
但你的程式會非常非常的安全,因為你無法調用一個空指針
而不像以前寫c的時候那樣,成天因為空指針而擔驚受怕
當然,如果你深入瞭解這一行,就會發現java其實也無法保證程式不去調用空的指針
但是它會在最大程度上避免空指針的調用
這已經很好了,安全,這是java的最突出的優點

第三個,虛擬機跨平臺,這是java最大的特點,跨平臺

可能所有人都知道windows,但是不是所有人都知道unix
和java一樣,很多人都不知道unix這種操作系統乾什麼用
我不想多說unix的應用,這不是主要,但是我要說,大部分小型機
工作站,都跑在unix一族的操作系統上,比如linux/solaris
unix比起windows有一個最顯著的特點,穩定,這就好比思科和華為
思科的機器慢但穩定,華為的機器快但不穩定,作為伺服器這一端來說
要的皇怯卸囁歟俏榷ǎ評nix在伺服器端還是非常有市場的
而且很重要的windows不安全,在ms的宣傳中我想所有人都很少看到安全二字
因為windows操作系統針對的是pc用戶,pc死機就死機咯,大不了重啟
瘟95最經常冒出來的就是藍屏,在伺服器這一端上因為ms沒有自己的晶元
所以要做系統有些力不從心啊。扯遠了,那麼java可以做到在windows上編譯
然後在unix上運行,這是c/c++做不到的

那麼說到這裡,java能做什麼逐漸清晰起來
剛纔說到了,java程式有一個的特點是安全
這個安全是針對你的系統來說得,系統在跑了java程式之後會特別地穩定
而且還能跨平臺,那麼很明顯,java主要應用於除了windows操作系統以外所有的平臺
比如手機,伺服器
想想看,如果你寫的程式要跑在手機上,而手機有多少款用的是windows?
就算有,那如果你用c/c++,是不是要針對每一款手機寫一套程式呢?
累死,那跨平臺的java就不用,做到編譯一次,隨時運行
同樣,在伺服器這一端,如果我想給一個網路門戶站點,比如sina
寫一個應用程式,pc的性能肯定無法滿足sina這樣大站點併發數量的要求
那麼它就需要買伺服器,那麼伺服器ms沒有市場,而且windows很不安全
那麼十之八九會買一個sun/ibm的機器,或者hp,但不管是誰的機器
它裝的操作系統也不會是windows,因為windows太不安全了,而且多核的支持太差了
這個有空再說,那麼如果你要寫一個程式在這樣的機器上跑
難道我們就在這個機器上做開發麽?當然不可能,一般程式員開發用的都是pc,windows
那麼該怎麼辦?寫一個程式,然後再拿到伺服器上去編譯,去調試?
肯定不可能,所以我們就希望找到一個語言,編譯完生成程式之後
在pc上調試,然後直接移植到伺服器上去,那麼此時,我們就會毫不猶豫地選擇java
因為在跨平臺以及安全性來說,java永遠是第一選擇

ok,下麵說java的缺點

一慢,這其實是一種誤區,這就好比goto語句一樣
java也拋棄了指針,雖然看上去似乎變慢了,但是在這個兩三年硬體性能就能翻番的年代
速度已經不是我們關心的問題了,而且對於企業級的應用來說
沒有什麼比安全穩定更重要的,換句話說,我們可以忍受慢,但是不能忍受死機和藍屏
而且越大型的應用,這種慢的劣勢體現得越模糊
因為當系統項目越做越大,任何一個環節做不好都可能影響全局的情況下
安全尤其重要,而且就像goto語句一樣
這種過分追求速度的主張會給系統開發和糾錯以及維護帶來無可輓回甚至不可避免的損失
把記憶體交給電腦去管理吧,這種代價值得
我們做的不是pc游戲,沒必要把記憶體的那一點點消耗當親爹

二難看,又是一個誤區,很多人甚至拿出java swing控制項畫出的界面來說
呵呵,其實java不是不能畫得好看,IDEA就是java寫的IDE,挺漂亮的
但為什麼難看呢,是因為swing控制項它本身就是unix時代的產物,swing控制項貼近unix界面
老外看unix界面其實挺順眼的,他們就是吃unix飯長大的
而unix又是吃百家飯的,不像ms那麼唯利是圖,所以不怎麼對中國人友好
加上我國又沒有公司在做操作系統,所以看上去是不怎麼順眼
其實玩過unix的人都知道,unix對中文的支持一直不怎麼好

三我還沒想到,其他人補充

給初學者之二:從JDK說起

在知道了java有什麼優點,能做什麼之後
就該說一下java該如何去學了

在說java如何去學之前,有必要把java的幾個大方向做一個簡單說明
早在五年前,嗯,應該說是六年前,也就是99年的時候
sun公司做出了一個決定,將java應用平臺做一個劃分
畢竟在不同領域,語言應用特性是有區別的
針對不同領域內的應用,sun公司可以發佈相關高端標準來統一規範代碼
這三大塊就是J2SE,J2EE以及J2ME
這個舉措今天看來無疑是非常了不起的
正是由於這次革命性的發展,使java從一種小打小鬧游戲性的語言
發展成為今天企業級應用的基礎

這裡要特別說明一下J2SE J2EE J2ME中2的意思
其實2就是英文單詞to的諧音,就是to的意思
而不是second edition,當然java 2本身版本號就是1.2,也有點2nd edition的味道

說點題外的,sun公司發佈的java版本很有意思
雖然總是寫是1.X但其實外界對這種版的說法也就是X.0
比如java 2,其實就是java 1.2
1.3其實就是3.0,1.4就是4.0,現在所說的5.0 其實就是1.5
只是以前我們更習慣叫1.X而已
可能到了5.0以後,就全改叫X.0而不是1.X了
所以以後聽到別人說java 5.0,千萬別驚訝,其實就是1.5

在這三個J2*E中J2SE是基礎,就是java 2的標準版(java 2 standard edition)
也就是最基礎的java語言部分,無論學什麼java技術,J2SE都是必須掌握的
要使用J2SE就必須安裝JDK(java development kit)
JDK在sun公司的主頁上可以免費下載,下載後需要安裝,具體安裝流程看教材
JDK包含有五個部分:核心API,集成API,用戶界面API,發佈技術還有java虛擬機(JVM)

先說運行環境,運行環境最主要要說的就是java虛擬機(JVM)
前面我們說過java是跨平臺的語言,那麼如何做到跨平臺呢?畢竟每種操作系統都是不同的
java的設計者們提出了一個虛擬機的概念
在操作系統之上建立一個統一的平臺,這個平臺必須實現某些功能以支持程式的運行
如下圖:
-------------------------------------
| program |
-------------------------------------
| JVM |
-------------------------------------
| UNIX | Windows | Linux | Solaris |..
-------------------------------------
程式員所寫的每一個程式都先運行在虛擬機上
所有操作都必須經過虛擬機才能和操作系統交互
這樣做不僅統一了所有操作系統,同時也保證了操作系統的安全
要死機的話,死的是虛擬機(JVM)而操作系統並不會受此影響
而我們所說的java運行環境指的主要是JVM,其他的不說了,省略

下麵說說JDK(java development kit)的API,其實用JDK來包括運行環境以及開發工具
個人感覺是不恰當的,因為這三個單詞僅能說明開發工具,也就是幾個標準的API
而沒有讓人感覺到有運行環境的意思在裡面,這是題外
那麼什麼是API?
簡單地說就是Application Programming Interface,應用程式編程介面
在java裡面,就是一些已經寫好了的類打成的包
這又要解釋什麼是類什麼是包了,簡單說一下,包就是類的集合
一個包包含零個或多個類,嗯,具體的可以去看書
這些類是java的基礎類,常用的類,可以簡單理解成java的工具集

最後說一下JDK的發佈技術,其實按我的理解,講白了就是編譯器
將.java文件轉換成.class文件的一種技術
這三部分組成了JDK,有了JDK,就可以開發出J2SE應用軟體了
最原始的只要用一個記事本寫幾行代碼就可以了
但一般來說我們會使用效果比較好的開發工具,也就是IDE
在J2SE這一塊,特別推薦JCreator這款IDE
sun公司的產品,與JDK結合得幾乎是天衣無縫,非常適合初學者使用

教材方面中文的推薦電子工業出版社出版的《java教程》初級與高級篇各一本
還有就是《21天學通java》雖然有人說21天系列是爛書,但個人感覺
對於j2se,這本書翻譯得已經很不錯了,基本沒有什麼語法錯誤,語句也很通順
最後要說的就是《thinking in java》
這本書自然很經典,說得比較細,只是我覺得不太適合初學者,其實也不難
初學者直接看也不成問題,但個人感覺還是找本教材也就是前面推薦的兩款來看比較好
基本概念的理解還是用教材的,畢竟thinking in java有的版本翻譯得很爛
而且個人建議還是看原版比較好,當然這幾本都看最好了,但如果沒時間
至少精讀其中一本,然後再看其他兩本就可以,其實三本書內容也差不多
但看問題的角度方式以及面向的讀者也都不同,嗯,怎麼說呢,找適合自己的吧
最後要說的是
由於虛擬機的存在,J2SE的大多數軟體的使用會比一般桌面軟體慢一些
效果不盡如人意,現在大概只有swing控制項還在使用吧,其它沒怎麼聽說

J2EE&J2ME
這是java應用的重中之重,如果想拿高薪,最好把J2EE學好
記得以前在csdn上看過一個調查,月薪上萬的程式員主要從事哪方面的工作
十個中有八個是做J2EE的,其他兩個一個做J2ME,還有一個做嵌入式
也許有些誇張,但也從某一方面說明J2EE人才的稀缺以及應用的廣泛
所以如果想學java,只精通j2se是永遠不夠的,至少還需要時間去瞭解其它兩個J2*E

給初學者之三:java企業級應用之硬體篇

總算講到企業級應用了,內容開始逐漸有趣起來

java企業級應用分為硬體篇和軟體篇
重點在軟體,硬體是外延,嚴格地說與java沒有必然聯繫
但是,由於java是網路語言,不瞭解硬體的一些基礎知識
軟體知道再多也沒什麼用,不要上了戰場還不知道為什麼而打仗
硬體是軟體的基礎,在這個前提下,有必要專門花一點點篇幅來聊一下硬體

硬體,簡單地說就是我們實際生活中看得見摸得著的東西
也就是那些冰冷的機器,比如伺服器,個人電腦還有網路交換機,路由器等等

那麼先拋開網路設備不談,先來說說電腦電腦的歷史

在很早很早以前,人類創造了第一臺電腦,那時候的電腦只是一臺用來計算的機器
無比大,無比重,無比傻,除了算其它屁事不會做,沒有所謂的人工智慧與電腦網路
但是總算是誕生了,雖然以今天的眼光去看那時候的機器巨傻無比
只配叫做計算器而不是電腦,沒有邏輯思維能力,只會死算
但千里之行,始於足下,反正是造出來了

然後隨著時間的推移,製造業發展發展發展
電腦性能逐漸得到提升,速度快了起來,成本也逐漸低了下來
於是人們造出了第二台,第三台,第四台,第五台……第n台電腦
人們就造出了無數台電腦並使其成為一種產品
逐漸應用於許多複雜計算領域,不僅僅是科研,許多生產領域也開始出現電腦的影子

然後又隨著時間的推移,人們發現不可能把所有的電腦都做成一個樣子
因為各行各業對電腦性能的要求各不相同
於是開始把電腦劃分檔次,最簡單地是按照電腦的大小劃分
就是教科書上寫的大型機,中型機,小型機
//個人感覺這樣分純粹扯淡,還以為是小孩子玩球,分為大球,中球和小球
但是不管怎樣,電腦不再是千篇一律一個樣子了
按照性能的不同,在不同領域,出現了滿足符合不同要求的電腦

幾乎在同時,人們也開始考慮電腦之間通訊問題
人們開始考慮將不同的電腦連接起來,於是網線出現了,網路出現了
又隨著網路的發展,出現了一下專門為了定址而存在的機器
這就是路由器和交換機,然後又出現了一些公益性的組織或團體
他們制定了一系列的標準來規範以及管理我們的網路
於是3w出現了,電腦的網路時代來臨了

嗯,說到這裡,電腦發展到今天的歷史大概說完了
我們來詳細說說網路時代的電腦以及各個硬體供應商之間的關係

前面說到了,電腦分為大型機,中型機和小型機……
但是現在市場上沒有人這樣分,要是出去買機器,對硬體供應商說
我要買一款中型機,或者說,我要買一款小型機,硬體供應商肯定會問問題
他們會問你買機器乾什麼用的?科學計算啊還是居家用,是作伺服器啊還是圖形設計
但不管怎樣,簡單地說大中小型機已經沒有什麼意義了
我們按照使用範疇來劃分
簡單劃分為
伺服器,工作站還有微機

伺服器(server)
伺服器涵蓋了幾乎所有的大型機以及大部分中型機甚至一些小型機
用通俗點話說衿骶褪悄掣齬?4小時不間斷運行提供服務的機器
比如賣飛機票(中航信),比如酒店預定(攜程)
比如提供門戶站點相關服務(sina),比如電子商務(ebay,amazon,阿裡巴巴)
這些服務對機器都有一些特定的要求,尤其強調安全和穩定

工作站(workstation)
工作站其實是圖形工作站的簡稱,說白了,就是某種功能極其強大的電腦
用於特定領域,比如工程設計,動畫製作,科學研究等

個人電腦/微機(pc)
電腦網路的最末端,這個應該不用我說太多了
網路時代的pc已經普及到千家萬戶

說完了分類,我們就來說說各個硬體供應商
首先是伺服器還有工作站
這兩類硬體供應商主要是以下三家
Sun,IBM還有HP(惠普)

然後是PC
以前IBM還有PC事業部,現在被聯想吞併了(蛇吞象)
現在國際市場上有聯想和DELL(戴爾),目前戴爾還是國際老大
還有HP康柏

然後是網路,也就是路由器和交換機
這塊市場嘛,Cisco(思科)Brocade(博科)還有McDATA三足鼎立

內核(CPU)
PC內核
主要是AMD和Intel,前者最近與Sun公司合作,Sun也有一部分單雙核伺服器用的是AMD的
伺服器與工作站內核
這一塊與硬體廠商綁定
還是Sun,IBM,HP三家自己生產

題外
在一些大型主機應用市場,比如賣飛機票
德國的漢莎,中國的中航信,香港的國泰用的都是尤利(美國的公司,英文名我忘了)
其它用的是IBM的機器,現在能做大型機的感覺似乎只有IBM可以
尤利已經快倒了,技術太落後了,現在他們的系統還是fortran寫的,連c都不支持

要特別說明的是,一個超大型主機然後多個小終端/pc的結構現在越來越沒市場了
將來的趨勢是用一整個包含多個伺服器的分散式操作系統來取代這些大型主機
因為大型主機更新換代極其困難,一旦數據量超過了主機的處理能力
那麼就要換主機,這個成本是極大的,但是如果用分散式操作系統
那就只需要增加小伺服器就行了

硬體就大概說到這裡,與大多數人沒什麼關係
因為大多數人壓根不可能進入這些硬體領域,除非做銷售
說了這麼多,只是為了給軟體部分打基礎而已
//做嵌入式的除外

給初學者之四:java企業級應用之軟體篇

嗯,說過了硬體就該是軟體了
這篇是這個系列的重中之重

首先我們來說說什麼是軟體,統一一下概念

所謂軟體通俗地說就是一套電腦程式
實現了某些功能的電腦程式
在很早很早以前,一臺電腦的軟體是不分層次結構的
一臺電腦只有一個系統,這個系統既是操作系統又是應用軟體,與硬體緊密綁定
後來經過許多年的發展發展發展
人們把一些與硬體緊密相連的又經常用到必不可少的功能做到一套程式中去
這一套程式就被人們稱做操作系統
另外一些可有可無的,不同工作適應不同環境的功能封裝到另外一套程式中去
而這一系列程式被人們稱作應用軟體
如下圖:
-------------------------------------------
|應用軟體:falshgat/IE/realplayer/winamp..|
-------------------------------------------
|操作系統:UNIX/Windows/Linux/Solaris... |
-------------------------------------------
前一篇我們知道,硬體分為伺服器工作站與pc
其實無論哪種硬體的軟體,都有操作系統與應用軟體

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

下麵放著這些概念不談,我們來說說將來的趨勢
趨勢一:
瘦客戶端,很早很早以前,當時C/S模式也就是client/server
客戶端軟體大行其道的年代,一個pc用戶,是採用一個傻終端連接到伺服器上
然後進行相應的操作,最典型的就是我們上bbs經常用的c-term
這就是那個時代的產物,同樣還有我國現行的機票定座用的e-term
後來呢,瀏覽器變得非常流行,人們發現,瀏覽器也能傳遞一些數據
雖然這些數據並不像那些終端那樣準確,但應付大多數日常需求足夠了
於是人們就提出一個瘦客戶端概念,也就是說,將來表示層所有的其他軟體疾揮?
我們唯一需要的就是一個網頁瀏覽器,然後通過瀏覽器輸入ip地址連接到伺服器
然後進行相關的操作,由於網頁瀏覽器一般每個操作系統都有自帶一個
這樣做就達到了給我們客戶端瘦身的目的(不需要安裝額外軟體)
這樣模式被稱作B/S模式,也就是browser/server模式
但需要指出的是,雖然瘦客戶端是趨勢,但並不代表胖客戶端沒有市場
尤其是一些複雜的業務操作,還是瀏覽器這種簡單軟體無法勝任的

趨勢二:
傻資料庫,ok,首先,我承認,這個名詞是我發明的,但我實在無法找到一個更好的表達
什麼是傻資料庫,如果誰對資料庫有所瞭解的話,就知道,以前的資料庫
有自己的一套管理體系,甚至有自己的客戶端,比如oracle,mysql,sqlserver都有
在某個管理工具上寫什麼sql語句查詢資料庫是我們以前常做的事
那麼將來我們提倡的是:將所有的業務邏輯封裝到業務邏輯層去
管理的事情由軟體來做,由業務邏輯層的軟體來做
所謂傻資料庫就是說,將來的資料庫什麼事都不用做
只用把數據給我保存好就行了,那些複雜的業務邏輯什麼外鍵什麼關聯
都沒資料庫什麼事了,都交給業務邏輯層軟體來做
這樣做的好處就是:我們就不需要這些該死難懂又複雜的資料庫系列管理工具了
而且這些工具每個資料庫都有自己的工具,完全不一樣,亂七八糟,沒有人喜歡面對他們
除了資料庫維護人員,也就是DBA,我們是軟體工程師,維護的事讓他們去做
而且嚴禁資料庫維護人員改動資料庫的數據,他們只做備份,必要時候恢復一下就是了

瞭解了這兩個趨勢之後,是不是有種砍頭去尾保中間的感覺?
沒錯,未來的趨勢就是中間件時代,中間件工程師將是未來電腦應用的主流
那再次統一一下概念,什麼是中間件?
記得我上學的時候,看ibm的教材,看了半天中間件定義,就看懂記住一句話
中間件是做別人不願意去做的事情,現在想想,狗屁定義,呵呵
什麼是中間件,中間件是業務邏輯層的應用軟體
是處理業務數據與客戶端之間業務邏輯的一種應用軟體
一種提供網路服務的伺服器端應用軟體
舉個非常簡單的例子,網上銀行,某個人想用IE進入工行的賬戶,然後轉帳
在這個例子中,客戶端表示層顯然是IE,數據持久層顯然是銀行的核心資料庫
那麼中間件是什麼?中間件就是提供這種服務的系統

這三層的劃分如下
------------------------------
|表示層 | 業務邏輯層 | 數據持久層 |
------------------------------
| IE | 網上銀行 | 資料庫 |
------------------------------

給初學者之五:企業級應用之中間件

前面一篇簡單介紹了一下應用軟體的分層 
下麵重點介紹一下中間件,也就是業務邏輯層的軟體結構 

從本系列第二篇我們知道,java程式是跑在虛擬機之上的 
大致結構如下: 
------------ 
| grogram | 
------------ 
| 虛擬機 | 
------------ 
| 操作系統 | 
------------ 
也就是說操作系統先運行一個java虛擬機,然後再在虛擬機之上運行java程式 
這樣做的好處前面也說過了,就是安全,一旦出現病毒或是其他什麼東西 
掛掉的是虛擬機,操作系統並不會受多大影響 

這時候有人可能會問,為什麼非要虛擬機?把操作系統當成虛擬機為什麼不行? 
可以,當然可以,但是這樣做某一個應用軟體的bug就可能造成整個操作系統的死亡 
比如說我們在某個伺服器上安裝了一個收發電子郵件的軟體和java虛擬機 
那麼一旦黑客通過收發電子郵件的軟體入侵系統,那麼操作系統就整個玩完 
那麼如果黑客通過java程式進行攻擊的話,那麼死的將會是虛擬機而不是操作系統 
大不了虛擬機崩潰,而操作系統正常運行不受任何影響 

舉個簡單例子,比如說最常見的是將資料庫(DB)與中間件放在同一臺伺服器上 
------------------------ 
| program | | 
-----------| DB | 
| 虛擬機 | | 
------------------------ 
| 操作系統 | 
------------------------ 
那麼此時如果沒有虛擬機,黑客病毒攻擊中間件系統,就有可能造成操作系統的死亡 
那此時資料庫也有可能跟著一起玩完,那損失可就大咯 
那如果此時有虛擬機,那麼一旦被攻擊,死的是虛擬機,操作系統與資料庫不受任何影響 

嗯,回顧完虛擬機,再來介紹中間件 
在很早很早以前,任何一家企業,想要搭建一個區域網系統,他需要請許多個工程師 
比如說我們想搭建一個網上銀行,客戶端用瀏覽器,後臺資料庫比如說用oracle 

那麼搭建這樣一個網上銀行,可能需要用到多少個工程師,我們來算一算 
首先,由於客戶端用的是瀏覽器,我們需要一些瞭解網路通訊協議以及一些瀏覽器標準的網路工程師 
其次,由於後臺資料庫用的是oracle,那我們還需要請oracle的工程師,因為資料庫這一層每個資料庫公司的介面什麼都不一樣 
然後,我們還需要一些操作系統的工程師,因為我們的系統需要跟操作系統直接交互 
最後,我們需要一些設計網上銀行系統及其相關業務的工程師 

太多了太多了,這樣一個中間件隊伍實在太龐大了,製作維護成本實在太高了 
不僅如此,這樣一個中間件就算做出來,他們所寫的代碼也只能滿足這一家公司使用 
其它公司統統不能再用,代碼重用率極低,近乎不可能重用 
畢竟這個系統中改動任何一個部分都有可能涉及到整個系統的改動 

那麼如何降低成本? 

我舉出了四組的工程師: 
網路工程師,資料庫工程師,操作系統工程師以及設計網上銀行系統的業務工程師 
除了最後一組設計網上銀行的業務工程師之外,前面三組工程師是不是每一個項目都需要的? 
就算不是每一個項目都需要,至少也是絕大多數項目需要的吧? 
哪個項目能夠脫離網路,資料庫和操作系統?不可能,在這個時代已經很少很少了 
好,那既然每個項目都需要,我們是不是可以用一個產品來取代這三組的工程師呢? 
我們的業務工程師只需要遵循這個產品所提供的介面,進行相應的開發就行了 
人們提出了一種叫做appserver也就是應用伺服器的東西 
應用伺服器是乾什麼的?按官方的說法,應用伺服器是包括有多個容器的軟體伺服器 
那容器是什麼?容器(Container)到底是個什麼東西我想多數人還是不清楚 

在說這個之前,先介紹一下組件 
什麼是組件,組件是什麼?組件其實就是一個應用程式塊 
但是它們不是完整的應用程式,不能單獨運行 
就有如一輛汽車,車門是一個組件,車燈也是一個組件 
但是光有車燈車門沒有用,它們不能跑上公路 
在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企業級應用之綜合篇

我們知道中間件有很多種規範以及相關的模型 
最流行的一個是j2ee還有一個是.net 
那麼各大公司關於這兩套規範各有什麼產品以及周邊呢? 

j2ee: 

黃金組合 
操作系統:Solaris 
應用伺服器:Weblogic 
資料庫:Oracle 
開發工具:JBuilider/IntelliJ IDEA 
優點:性能一級棒,大企業大公司做系統的首選,世界五百強幾乎都是這套組合 
缺點:極貴 

超級組合,也是最安全最酷的黃金組合,硬體採用SUN公司的機器 
但是SUN的伺服器很貴,同等價格不如去買IBM的機器 
SUN的伺服器支持Solaris的效果自然不用說,Solaris號稱是世界上最安全的操作系統 
Oracle也是世界上最安全,性能最優的資料庫,Weblogic是當今性能最優的appserver 
JBuilder和IDEA各有所長,JBuilder是Borland公司的招牌之一 
是當今世界上最流行的java IDE,用delphi寫的,但網路上評價似乎不是很好 
IDEA擁有插件功能,界面在所有java IDE中最為漂亮,東歐人開發的產品 
東歐人嚴謹的作風在這個產品上體現得尤為突出,用java寫的 
IDEA甚至號稱自己被業界公認為是最好的IDE//個人保留意見,沒有最好只有更好 
但我用JBuilder的時候發現了不少bug,而至今還沒有在IDEA上發現什麼bug 
個人推薦IDEA 
價格方面,Solaris開源,但是SUN的伺服器比較貴,Weblogic最高是34萬 
oracle標準版要18.6萬,企業版要49萬,JBuilder要2.7萬左右 
IDEA零售價大概是500美金,也就是5000多元 
另外,雖然理論上這些產品的綜合性能要高於其他選擇,但是必須看到 
由於產商之間的利益衝突,比如oracle也有自己的appserver,但是性能不怎樣 
使得這幾種產品之間協作的性能要比預想中的要差一點點 
-- 
開源系列 
操作系統:- 
應用伺服器:JBoss 
資料庫:MySql 
開發工具:Netbeans 
優點:便宜,性能未必最佳,但是對付中小企業足夠了 
缺點:出了問題自己抗吧 

嗯,這是java陣營最大的特色,免費免費,還有在開發工具這一欄Eclipse也是免費的 
但後面要說,算了,換個有代表性的開源產品來 
tomcat僅有web容器而沒有ejb容器,而jboss已經集成了tomcat 
也就是說下載了jboss之後,啟動的同時也就啟動了tomcat 
jboss在tomcat基礎之上多加了一個ejb容器,使得jboss+tomcat成為和weblogic 
websphere之外又一個得到廣泛應用的appserver 
現在大概是這樣,中小型企業多用jboss,如果應用小一點就用tomcat 
只有給那些大型企業做的項目,才會花錢去上一個weblogic或者websphere 
mysql也是開源的資料庫,做得非常不錯,如果系統對資料庫要求不高 
或者安全要求不是非常嚴格,mysql是一個非常不錯的選擇 
開發工具方面,netbeans是sun公司極力推廣的一種IDE 
聽說在北美市場使用量已經超過eclipse了 
操作系統,軟體再不用錢,伺服器也要錢,看這台機器上跑什麼操作系統就用什麼了 
-- 
IBM套餐 
操作系統:Linux 
應用伺服器:Websphere 
資料庫:DB2 
開發工具:Eclipse/WebSphere Studio 
優點:服務好,IBM可以提供全套服務,也可以替客戶承擔風險 
缺點:把機器數據全部交給IBM,安全什麼的都由不得你了 

呵呵,IBM全套產品,甚至包括硬體設備IBM的伺服器 
由於是一個公司的產品,各產品之間的協作自然不錯
價格方面,Linux,DB2,Eclipse都是開源產品,Websphere目前零售價是33.8萬人民幣 
IBM伺服器不錯,可以考慮 
-- 
.net: 

微軟陣營 
操作系統:Windows 
應用伺服器:.net應用伺服器(好像叫IIS) 
資料庫:SqlServer 
開發工具:MS Visual Studio 
優點:客戶端的用戶體驗良好,和客戶端諸多微軟產品的相容性強 
缺點:離開了微軟,寸步難行,和其他任何一家公司的產品都不相容 

微軟的東西,怎麼說呢,太專橫了 
微軟所有的東西都是圍繞著windows來做的 
.net其實已經可以實現跨平臺了,但是微軟出於自身商業考慮 
在其應用伺服器跨平臺的實現上設置了種種障礙 
而且針對windows,微軟做了大量的優化,可以這麼看 
.net就是與windows捆綁的一套產品 
所以有些人說,微軟的產品離開了windows,就是渣 
而且.net開源選擇也少,安全性方面考慮,windows本身就有一堆補丁要打了 
sqlserver也不安全,至於.net到底安全不安全我不清楚,畢竟我沒怎麼用過 
但整體考慮,感覺.net不是大企業的首選,鑒於其濃厚的商業背景 
也不是中小企業的首選,但是必須看到 
客戶端也就是微機pc市場已經完全被windows所壟斷 
所以在一些快速開發,還有和微軟產品相容性要求較高的領域,.net還是比較有市場的 
最後一個visual studio對它之前的版本相容,且支持c,c++,c#,vb等語言 
在其傳統領域,比如寫一些桌面軟體等客戶端應用上,.net還是第一選擇 
-- 
最後要說明的是 
這些組合不是固定不變的 
由於J2EE得到了絕大多數IT企業的支持以及JAVA跨平臺的特性 
我們可以自由地定製個性化的組合 
比如我可以選擇windows+jboss+eclipse+oracle 
也可以選擇solaris+websphere+IDEA+mysql 
等等,這些自由組合都是可以的,但是有一點必須說明 
微軟的東西,一般來說離開了windows就不能用 
比如你選擇了.net應用伺服器,那操作系統就必須是windows 
你選擇了sqlserver,那就必須在windows上用 
還有就是遵循j2ee規範的所有的組件都可以在不同的應用伺服器上互相移植 
比如你可以在測試的時候用jboss 
而在正式投產上線的時候使用websphere,只需要在配置文件中作相應改動即可

給初學者之七:java企業級應用之術語篇

在瞭解完J2ee的相關周邊產品之後需要深入J2ee規範內部去瞭解一下到底這些規範 
這裡介紹幾個最常用的規範 
再繼續說下去之前有必要說幾個常識 

Java的誕生 
Java之父James Gosling早年從cmu畢業之後 
從事了一段時間的開發工作,後來意外碰到一個項目
這個項目要求他用C++開發,但可愛的JG是天才,凡是天才在某方面特別突出的同時 
必然有一些天生的缺陷,恩,或說共性,比如說懶,急躁和傲慢 
JG既然是天才,那就必然具備這些共性,JG懶,以至於他學不好C++ 
不僅他學不好,當年開發出Java的那個團隊也都學不好C++ 
他們急噪,以至於他們中有人甚至威脅以辭職的方式離開這個需要使用CPP開發的項目 
他們傲慢,所以他們決定開發出一種新的語言來取代那個該死的CPP 
更可愛的是,他們一開始居然給這門語言起名C++++--//沒錯,我沒敲錯 
叫什麼C加加 加加減減,意思是加上一些好東西,減去一些壞東西 
天才的設定,有時候你會發現天才和傻瓜真的只有一線之隔 
還好這個可愛的名字沒有被繼承下來,這些天才們給他們的產物起名叫Oak//橡樹 
只是後來當他們去註冊這個名字的時候,發現這個名字已經被註冊了 
於是在Sun公司的一個女職員//mm就是心細,這個說法也是我們公司mm告訴我的 
的提議下,把這個可愛的語言起名為Java,就是他們當時喝的咖啡的名字 
所以我們看到Java的標誌就是一杯冒著熱氣的咖啡 

JavaBean 瞭解完Java之後,再來說說什麼是JavaBean//華為面試題 
JavaBean是什麼? 咖啡豆 
ja,更為科學點的解釋是 
用java語言編寫的可重用的軟體組件//組件的定義前面說過了,不再重覆 
很形象不是麽? 將javabean放入杯子//容器,還記得容器的概念麽?web容器,ejb容器 
就可以沖泡//編譯 成咖啡,供客人們品嘗//運行 
完美的服務 

下麵進入正題 再談容器 
前面介紹過容器,我覺得有必要再補充一點 
容器從某種意義上說其實就是一個可運行的java寫的應用程式 
猶如c++/c編譯後生成的.exe文件 
不同的是java編譯後的文件需要用命令行或者腳本啟動執行 
由於容器是由java寫的,所以容器都能夠跨平臺 
雖說如此,似乎大部分容器都針對不同的操作系統提供了不同的版本 
但可以肯定的一點是,相同容器間的移植組件不需要重新編譯 

Servlet web容器組件 
Servlet確切地說,就是web容器運行的java組件 
與普通javabean不同的是,Servlet定義了一系列方法//比如init()和destroy() 
供容器調用,調用的主要目的是為了管理 
當一個request請求被web容器截獲之後,容器分析該請求地址 
然後通過一個配置文件中的映射表//web.xml 
調用相應的Servlet組件處理後將結果返還給客戶端 

JSP//Java Server Page 
web容器組件 
Servlet出現了之後,人們發現幾乎沒有辦法用一個非常直觀的方式去編寫頁面 
畢竟頁面是html語言編寫的 
而讓我們用一種流程式的處理方式去逐行教電腦如何寫html代碼太困難 
在這種情況下JSP應運而生,JSP將java代碼嵌入html代碼內部 
然後存成.jsp文件,再由電腦編譯生成Servlet儲存起來//註意這個過程 
所以JSP和Servlet對於web容器來說其實是一種東西,雖然它們編寫遵循的標準有所不同 
極大地簡化了代碼同時增加了代碼的可讀性,生產維護成本下降 
值得一提的是,在制定JSP規範的過程中,借鑒了ASP的很多規範 
寫過ASP並熟悉Java語言的人應該能很快掌握JSP 

EJB//Enterprise JavaBean 
ejb容器組件 
隨著時間的推移,人們發現普通的JavaBean似乎並不能滿足企業級應用的需要 
最典型的就是虛擬機提供的垃圾回收收集機制也就是GC不夠完善 
可以優化的餘地極大,在這種情況下,EJB應運而生 
EJB和其它組件一樣,不過遵循了某些規範而已 
但是這些規範更多的是為充分利用機器並提高性能為主要目的的 
舉個簡單例子 
比如某個web伺服器有100個用戶同時連接上 
由於網路連接是瞬時連接,所以很多時候併發數並沒有100那麼大 
前一秒有可能有30個請求被髮送過來並被處理 
後一秒可以只有10個請求被髮送過來並被處理 
只有在非常非常極端的情況下才有可能發生100個請求同時被髮送過來並被處理的情況 
那麼我們是否需要保留100個那麼多個對象在伺服器的記憶體裡面去處理這些請求呢? 
很顯然,不需要,大多數時候//甚至可以說是所有時候,我不相信有那麼極端的情況 
我們只需要保存其中的10-30%就夠了,那麼什麼時候需要20%,什麼時候需要50% 
甚至100%,這個過程就交給容器去管理,這就是ejb容器每天在乾的事 
管理記憶體中活躍的對象 

恩,必須強調的一點是,由於使用的不成熟 
我們經常把規範以及具體的應用兩個名詞混用 
舉個簡單例子,我們說Servlet,極有可能說的是Servlet規範 
也有可能說的是一個具體的Servlet,這個就要看情況而定了 
EJB,JSP也是如此 

JDBC 
和資料庫的連接 
這個嚴格說來是資料庫產商需要關心的事 
關於AppServer如何與資料庫的連接 
但是也需要開發人員做一點事,因為AppServer不知道什麼時候組件需要用到資料庫 
同時也需要開發人員告訴AppServer他們使用的是什麼資料庫,ip地址等等 
JDBC就是關於這一套東東的規範 
包括資料庫的產商應提供什麼樣的介面 
AppServer應用伺服器應該如何去連接 
開發人員應該如何去配置這些連接等等 
還有一些數據源,連接池等概念參考相關數據在此就不再贅述 
其它的規範比如JMX等確切地說與開發人員關聯並不大了 
這類高級應用只對AppServer應用伺服器產商重要 
也不再羅嗦了 
--------- 
記得聽說過這樣一種說法 
大一時候不知道自己不知道 大二時候知道自己不知道 大三時候不知道自己知道 大四時候知道自己知道 為什麼呢,因為大一時候剛進大學,什麼都不懂,很正常,大家都一樣 
大二或者大三時候開始接觸知識,雖然還是不懂,但慢慢地開始學習,開始積累 
過了一段時間,知道自己知道了//也就是前一種說法的大四,後一種說法的大三 
開始屁癲,開始拽得不得了,覺得自己懷才不遇,千里馬難尋伯樂的那種感覺 
有些人是大四畢業了以後開始拽,悟性高一點的,大三就開始拽,因人而異 
這幾乎是每一個初學者經過一段時間學習後的必然階段 
不管如何,總之開始入門了,這也不是壞事 
但最後每個人都會知道自己不知道的,也就是後一種說法的大四階段 
//前一種說法裡面的那些家伙估計要到工作以後才能明白 
因為任何一門學科都博大精深,要是能在兩三年之內就統統搞懂 
那不是在吹牛就是坐井觀天,java如此,c如此,c++也是如此 

那麼到了本系列的第七集,可愛的讀者應該處在什麼階段呢? 
恭喜,在看完這篇文章之後,你就基本處於知道自己不知道的那種階段 
離拽起來還有那麼一段距離,因為你們畢竟還沒有學習和積累一定的基礎知識 
但是騙騙外行,矇矇國企那些吃閑飯的管理人員問題不大

給初學者之八:java高級應用之框架篇

沒錯,我沒敲錯 
之所以不再聲稱是企業級應用而稱之為高級應用 是因為下麵要講的東西屬於純民間性質 
是java具體應用的上層建築,可用可不用,沒有人強迫你用 

首先給框架//framework 下一個定義 
我想讀者你可能聽說過.net framework這個概念 
沒錯,我們將要說的framework也和這個framework差不多 
所不同的是.net framework的競爭對象是j2ee那一系列標準 
而我們將要說到的幾個框架則應用在j2ee的不同層面 
單就單個框架而言,沒有.net framework管得那麼多 
但是卻要比它精專多了,而且總量加起來,也遠比微軟那一套框架要廣泛得多 
回到正題,框架是什麼? 
軟體工程之所以被叫做軟體工程就是因為有那麼一批人覺得可以用工程學裡面 
那些管理Project的方法來管理軟體從開發到維護這一系列流程 
那麼在建築工程裡面框架是什麼? 
現在建築多採用鋼筋混凝土結構,註意裡面一個很重要的辭彙:鋼筋 
托福閱讀中曾有一題聽力就是關於鋼筋結構的誕生,在美國 
恩,現代建築中多在建築起來之前,先用鋼筋搭建出一個框架出來 
然後往鋼筋中間填入混凝土,從而形成一個完成的建築 
而今天要說到的框架就是這麼一個東西在每一個軟體中間的實現 
框架就是那麼一個通過預先寫好代碼從而幫我們建立起一個軟體結構的這麼一個東西 

這裡提一下框架與規範//主要指J2ee規範也就是官方標準的區別 
從某種意義上說,J2ee規範本身就是一個框架 
無論是web容器也好,還是ejb容器也好,它們都開發了一部分通用的代碼 
並且幫助我們搭建起來了一個軟體結構,我們要做的就是往裡面填入組件 
比如ejb/servlet/jsp等等 
沒錯,要這麼理解也沒錯,但是為了避免混亂,我們還是嚴格區分開來 
本文中將要提到的框架如無特別說明,就是指的是非官方標準的框架 
規範是規範,而框架是建立在規範之上的一種東西 
可以說是標準的延續,或者說是民間的嘗試,總之是這麼一個非官方的東西 
說到這裡順便提一下JCP組織也就是Java Community Process/Java社區 
當初Sun公司在java發佈之初,為了提倡開源和共項 
同時也出於一個提出合理的標準的目的,而讓廣大的開發者參與標準的制定 
而成立了這樣一個社區,現在還健在,網址是jcp.org 
每一個新的規範發佈之前都會在這個社區廣泛討論,最終對規範的制定產生巨大的影響 
其中就包括企業級的參與者,相當有名的JBoss以及我國的金碟公司都是其中的成員 

下麵介紹一下幾個相當著名的框架,必須要指出的是,雖然框架大多開源 但並不代表所有的框架都開源,比如.net framework,但是java框架大多數開源 
言歸正傳 
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 
什麼叫控制反轉呢? 
套用好萊塢的一句名言就是:你呆著別動,到時我會找你。 
什麼意思呢?就好比一個皇帝和太監 
有一天皇帝想幸某個美女,於是跟太監說,今夜我要寵幸美女 
皇帝往往不會告訴太監,今晚幾點會回宮,會回哪張龍床,他只會告訴太監他要哪位美女 
其它一切都交由太監去安排,到了晚上皇帝回宮時,自然會有美女出現在皇帝的龍床上 
這就是控制反轉,而把美女送到皇帝的寢宮裡面去就是註射 
太監就是是框架裡面的註射控制器類BeanFactory,負責找到美女並送到龍床上去 
整個後宮可以看成是Spring框架,美女就是Spring控制下的JavaBean 
而傳統的模式就是一個饑渴男去找靚女出台 
找領班,幫助給介紹一個云云,於是領班就開始給他張羅 
介紹一個合適的給他,完事後,再把小姐還給領班,下次再來 
這個過程中,領班就是查詢上下文Context,領班的一個職能就是給客戶找到他們所要的小姐 
這就是lookup()方法,領班手中的小姐名錄就是JNDI//Java Naming and Directory Interface 
小姐就是EJB,饑渴男是客戶端,青樓是EJB容器 
看到區別了麽?饑渴男去找靚女出台很麻煩,不僅得找,用完後還得把小姐給還回去 
而皇帝爽翻了,什麼都不用管,交給太監去處理,控制權轉移到太監手中去了 
而不是皇帝,必要時候由太監給註射進去就可以了 
看到Spring的美妙了吧,Spring還提供了與多個主流框架的支持 
可以和其它開源框架集成 
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 
還在不停增加中,不可能一一列舉,有興趣的可以去看相應文檔 要指出的是框架不是應用程式 
只是一堆組件的有序複合,應用時不能脫離於應用伺服器單獨存在

給初學者之九:收尾

最後一篇介紹幾個常見的概念
設計模式 
這可不僅是java獨有 
我看的書就是c++和smalltalk例子的 
先說說什麼是設計模式 
模式是什麼?模式是經驗的總結,潛規則的抽象 
什麼意思呢?比如說我們坐飛機,上飛機前需要經過幾個步驟 
什麼安檢領取登機牌之類的,這一套流程能不能改呢? 
可以,但為什麼幾乎全世界的航空公司登機前都是這一套流程呢? 
因為航空公司經過長期實踐之後得出了一堆結論和經驗 
並認為這樣做才是最安全,或說是最有效率的 
這就是模式,模式是編程高手之間交流的橋梁 
兩個編程高手通過統一命名的模式瞭解對方的思想 
當然不藉助模式可不可以?當然可以,只是模式無處不在,你不知道而已 
又比如吃飯,每吃一口飯,我們要先端碗,拿筷子,張嘴,塞飯入口,咀嚼最後吞咽 
這就是一套模式,我們給這套模式命名為吃飯 
那麼當老爸叫吃飯的時候,我們就能明白什麼意思 
而不用老爸進來囈囈啊啊並比畫上半天,啞語也不是這麼用的 
這就是模式,已知的模式有400多種//好象更多,不記得了 
比如資料庫有資料庫的設計模式,編程有編程的模式等等 
面向對象有常用的21種模式,需要掌握,主要分為創建,行為,結構三類 
J2ee有J2ee的模式,Sun公司出了一本書叫《J2EE核心模式》可以拿來看看 
必需要指明的是,模式不是規範,比如吃飯模式 
沒有人規定你吃飯非得要那麼吃,你可以端碗,上拋,張嘴在下落後連碗一起吞咽 
這也可以,只要你願意,同樣,只要你願意,你就可以不遵循模式 
模式之外還有反模式,學模式不可定勢,不要學死,活學活用,無招勝有招才是最高境界 

JavaDoc 
文檔工具,極其好用 
可以根據註釋自動生成HTML文檔 

Ant 
98年,有一位程式員在從歐洲飛回美國的飛機上想到了這麼一個東西 
從而改變了整個世界,他的名字叫James Duncan Davidson 
組織管理工具,可以這麼描述它 
比如你想在編譯之後自動再次生成JavaDoc 
那麼你只需要編輯Ant腳本//對,就像Windows腳本那樣 
然後批處理就可以了,不過現在Ant已經廣泛集成到IDE中去 
不需要自己手動編寫,不過如果想要炫炫,據說此招百試不爽 

JUnit 
測試工具,Unit家族可不只有JUnit 
還有其它版本的,這個不細說,具體實踐一下就明白了 

POJO 
//Plain Old Java Object 
就是傳統的Java對象,也就是一個JavaBean 
由虛擬

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於一些企業內部核心系統,特別是外網訪問的時候,為了信息安全,可能需要對外部訪問的IP地址作限制,雖然IIS中也提供了根據IP地址或IP地址段進行限制或允許,但並沒有提供根據IP地址所在的城市進行限制或允許。本文主要通過自定義擴展IHttpModule介面,考慮到性能IP資料庫主要採用QQwry純真 ...
  • DateTime dt = DateTime.Now;Label1.Text = dt.ToString();//2009-07-5 13:21:25Label2.Text = dt.ToFileTime().ToString();//127756416859912816Label3.Text = ...
  • C# 導出CSV文件 由於工作需要,需要在Web端請求後,將查詢的數據寫入CSV文檔,返回給Web。 註意點: 1.長字元串的的數字,比如身份證號碼之類的,在csv中顯示的是用科學計數法顯示的,因此需要轉換一下,例如:字元串“12345678987654321”, 寫入時為"=\"123456789 ...
  • 前言 前幾天看一個朋友的博客時,看他用到了C#6的特性,而6出來這麼長時間還沒有正兒八經看過它,今兒專門看了下新特性,說白了也不過是語法糖而已。但是用起來確實能讓你的代碼更加乾凈些。Let's try it. 1、集合初始化器 public class Post { public DateTime ...
  • 1. JVM相關(包括了各個版本的特性) 對於剛剛接觸Java的人來說,JVM相關的知識不一定需要理解很深,對此裡面的概念有一些簡單的瞭解即可。不過對於一個有著3年以上Java經驗的資深開發者來說,不會JVM幾乎是不可接受的。 JVM作為java運行的基礎,很難相信對於JVM一點都不瞭解的人可以把j ...
  • 需要在程式中使用二維數組,網上找到一種這樣的用法: 1 2 3 4 5 6 #創建一個寬度為3,高度為4的數組 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0]] myList = [[0] * 3] * 4 1 2 3 4 5 6 #創建一個寬度為3,高度為4的 ...
  • 探完閉包[查看],再探命名空間。 對於命名空間,官方文檔已經說得很詳細[查看],我在這裡做了一下實踐和總結。 命名空間一個最明確的目的就是解決重名問題,PHP中不允許兩個函數或者類出現相同的名字,否則會產生一個致命的錯誤。這種情況下只要避免命名重覆就可以解決,最常見的一種做法是約定一個首碼。 例:項 ...
  • 還是從HelloWorld開始說吧... #include <stdio.h> int main(int argc, char* argv[]) { printf("Hello World!\n"); return 0; } 從源文件Hello.cpp編譯鏈接成Hello.exe,需要經歷如下步驟: ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...