收集一些開源專案的架構圖
本文試圖以最簡短的語言解釋各個開源專案的架構,圖片均來源於網路
spring
spring的核心能力來源於ioc和aop。如果要一句話講清這兩個能力,那麼可以這麼描述,ioc就是一個大工廠,aop就是動態代理。
spring的核心全是圍繞著ioc這個大工廠,這個大工廠為什麼這麼牛,是因為物件從出生前到出生再到使用前能夠做很多事情。比如,出生的狀態(單例還是原型),出生的方式(xml配置或是annotation宣告),使用前的邏輯,使用後的邏輯等等;另外一個原因是分離了可變和不可變的部分,即使用介面程式設計(spring中可以做到不必非對介面程式設計),從而可以返回介面物件的任意子類,這是非常強大的能力,要知道,子類可以隨你改變而不需要通知外界是多麼牛x的事,這意味著你對子類的改變不需要影響到外界,介面為你隔離了這個變化。
如果你不敢相信一個工廠模式有這麼大的威力,說實話我也不敢相信,但是它發展至今就是如此牛。圍繞著如何構建ioc容器,spring有3個核心子專案,分別是bean, context, core。有個比喻比較貼切,bean負責包裝物件,core負責給bean提供支援,context則是負責維護bean包裝的物件之間的關係。
而我們平時經常用到的有2個次核心的專案,分別是mvc,mvc提供瞭解耦檢視和模型的能力,transaction則提供了統一各種需要事務操作的能力,如jdbc,jta。圍繞著這些核心和次核心專案,有了各種的其他spring子專案。
spring能力一覽
spring mvc
hibernate
hibernate提供了持久化物件到資料庫的全自動的能力。所謂全自動,就是呼叫方不用告訴hibernate任何額外資訊,直接使用blog.save(),甚至簡單的地方不需要寫sql,hibernate會根據已經配置好對映關係(表對映物件,行對映屬性)自動將該物件插入blog表,注意,這裡hibernate會自動為你管理一切引數。如果一句話描述其實現原理,就是Map + 反射,Map裡裝的是{物件名,表名}(當然,每個物件還對應一個Map,裝的是{屬性名,欄位名})
在hibernate中,session是主要的物件,一個session可以看做一個數據庫connection,而session factory可以看做是生產session的工廠。hibernate中query分這麼幾種方式:一是通過得到session從而呼叫原生sql;二是通過hql;三是通過criteria
在hibernate中,有這麼幾個問題值得研究,一個是hibernate的事務管理,另一個是hibernate的快取管理(為什麼有時候hibernate反而比jdbc更快),最後是hibernate的鎖管理(悲觀鎖和樂觀鎖)
mybatis
mybatis同hibernate一樣知名,不同的是,mybatis提供的是半自動的orm,所謂半自動,就是每個已知的CRUD都需要寫一個對應的sql來滿足實際需要。一句話描述還是Map + sql,不同於hibernate,這裡map裡裝的是{sqlId, sql},執行完畢後通過反射呼叫將結果裝配成對應類的物件(因此必須提供一個類名,你懂的)
jetty的架構圖
jetty是一個應用伺服器,不同於tomcat大而全的層次模型,jetty提供了小而靈活的外掛式機制,這裡的handler就是一個個外掛,這些外掛被組織成一個管道的形式,因而可以做各種事情,比如安全過濾,比如session處理,或者servlet處理(這個是根據一個請求的性質來的,請求就是一個可以流動的訊息)。
作為一個應用伺服器,最重要的兩個能力分別是處理連線以及處理請求,一般處理連線會有一個元件connector,處理請求會有另一個元件request_processor。連線負責監聽埠,並將得到的tcp資訊轉變為HttpServletRequest資訊,而processor負責處理request,負責請求的過濾,轉化和處理。
log4j2
log4j2是個高效能的日誌類庫,據說logback,slf4j和log4j都是一個傢伙寫的,後來想起一個高效能的方案,於是繼續沿用log4j的名字,升級為log4j2。
log4j2最大的改進和亮點就是效能,號稱內部使用disruptor做無鎖非同步,吞吐量比log4j高10倍以上。log4j2支援靈活的外掛機制,將api和實現分離開來,架構更加靈活。
log4j類設計主要關注Logger,LoggerConfig,Appender和Layout這條主線。他們各司其職,Layout主要負責展示,Appender主要負責輸出位置,log4j2增加了很多輸出的位置,資料庫,檔案,控制檯都不用說了,其他的諸如JMS,JPA,NOSQL,SMTP,SOCKET等各種想得到的位置,不能單純用強大來形容,每個Appender會hold住一個Layout;LoggerConfig主要儲存一些日誌相應的配置,和Configuration比起來,LoggerConfig管的東西更加細緻,Appender以Listener的形式監聽事件從而實現解耦;Logger則是實際記錄日誌的類,被快取在LoggerContext中。
每次我們取得一個Logger時,首先會從LoggerContext的快取中中查詢Logger,接下來會呼叫到LoggerConfig中的log方法,實際上是將這件事委託給LoggerConfig來做,接下來LoggerConfig生成LogEvent並呼叫將該Event通知每個Appender,Appender根據Layout最終完成日誌的記錄。
Log4j2最出彩的地方還是類的設計以及職責的分離,非常漂亮;以及後期的效能優化。
junit
junit是我們日常用的單元測試框架,沒有之一。
mysql