01 SpringMVC
參考博文:http://blog.csdn.net/evankaka/article/details/45501811
Spring Web MVC是一種基于JAVA的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基于請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發的。
- 模型(Model )封裝了應用程序的數據和一般他們會組成的POJO。
- 視圖(View)是負責呈現模型數據和一般它生成的html輸出,客戶端的瀏覽器能夠解釋。
- 控制器(Controller )負責處理用戶的請求,并建立適當的模型,并把它傳遞給視圖渲染。
Spring的web模型 - 視圖 - 控制器(MVC)框架是圍繞著處理所有的HTTP請求和響應的DispatcherServlet的設計。
Spring Web MVC處理請求的流程
具體執行步驟如下:
- 首先用戶發送請求————>前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它,即以前的控制器的控制邏輯部分;圖2-1中的1、2步驟;
- 頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數到一個對象,這個對象在Spring Web MVC中叫命令對象,并進行驗證,然后將命令對象委托給業務對象進行處理;處理完畢后返回一個ModelAndView(模型數據和邏輯視圖名);圖2-1中的3、4、5步驟;
- 前端控制器收回控制權,然后根據返回的邏輯視圖名,選擇相應的視圖進行渲染,并把模型數據傳入以便視圖渲染;圖2-1中的步驟6、7;
- 前端控制器再次收回控制權,將響應返回給用戶,圖2-1中的步驟8;至此整個結束。
02 Spring
參考博文:http://blog.csdn.net/cainiaowys/article/details/7107925
2.1、IOC容器:
參考博文:http://www.cnblogs.com/linjiqin/archive/2013/11/04/3407126.html
IOC容器就是具有依賴注入功能的容器,IOC容器負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。應用程序無需直接在代碼中new相關的對象,應用程序由IOC容器進行組裝。在Spring中BeanFactory是IOC容器的實際代表者。
2.2、AOP:
參考博文:http://blog.csdn.net/moreevan/article/details/11977115
簡單地說,就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護性。AOP代表的是一個橫向的關系
AOP用來封裝橫切關注點,具體可以在下面的場景中使用:
- Authentication 權限
- Caching 緩存
- Context passing 內容傳遞
- Error handling 錯誤處理
- Lazy loading 延遲加載
- Debugging 調試
- logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
- Performance optimization 性能優化
- Persistence 持久化
- Resource pooling 資源池
- Synchronization 同步
- Transactions 事務
03 Mybatis
參考博文:http://blog.csdn.net/u013142781/article/details/50388204
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
總體流程:
(1)加載配置并初始化
觸發條件:加載配置文件
將SQL的配置信息加載成為一個個MAppedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。
(2)接收調用請求
觸發條件:調用Mybatis提供的API
傳入參數:為SQL的ID和傳入參數對象
處理過程:將請求傳遞給下層的請求處理層進行處理。
(3)處理操作請求
觸發條件:API接口層傳遞請求過來
傳入參數:為SQL的ID和傳入參數對象
處理過程:
- 根據SQL的ID查找對應的MappedStatement對象。
- 根據傳入參數對象解析MappedStatement對象,得到最終要執行的SQL和執行傳入參數。
- 獲取數據庫連接,根據得到的最終SQL語句和執行傳入參數到數據庫執行,并得到執行結果。
- 根據MappedStatement對象中的結果映射配置對得到的執行結果進行轉換處理,并得到最終的處理結果。
- 釋放連接資源。
(4)返回處理結果將最終的處理結果返回。
MyBatis 最強大的特性之一就是它的動態語句功能。如果您以前有使用JDBC或者類似框架的經歷,您就會明白把SQL語句條件連接在一起是多么的痛苦,要確保不能忘記空格或者不要在columns列后面省略一個逗號等。動態語句能夠完全解決掉這些痛苦。
04 Dubbo
參考博文:http://blog.csdn.net/u013142781/article/details/50387583
Dubbo是一個分布式服務框架,致力于提供高性能和透明化的RPC(遠程過程調用協議)遠程服務調用方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分布式的需求,其實是不需要用的,只有在分布式的時候,才有dubbo這樣的分布式服務框架的需求,并且本質上是個服務調用的東東,說白了就是個遠程服務調用的分布式框架。
1、透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
2、軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
3、 服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基于接口名查詢服務提供者的IP地址,并且能夠平滑添加或刪除服務提供者。
節點角色說明:
- Provider: 暴露服務的服務提供方。
- Consumer: 調用遠程服務的服務消費方。
- Registry: 服務注冊與發現的注冊中心。
- Monitor: 統計服務的調用次數和調用時間的監控中心。
- Container: 服務運行容器。
05 Maven
參考博文:http://blog.csdn.net/u013142781/article/details/50316383
Maven這個個項目管理和構建自動化工具,越來越多的開發人員使用它來管理項目中的jar包。但是對于我們程序員來說,我們最關心的是它的項目構建功能。
06 RabbitMQ
參考博文:http://blog.csdn.net/u013142781/article/category/6061896
消息隊列一般是在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高了系統的吞吐量。
RabbitMQ是用Erlang實現的一個高并發高可靠AMQP消息隊列服務器。
Erlang是一門動態類型的函數式編程語言。對應到Erlang里,每個Actor對應著一個Erlang進程,進程之間通過消息傳遞進行通信。相比共享內存,進程間通過消息傳遞來通信帶來的直接好處就是消除了直接的鎖開銷(不考慮Erlang虛擬機底層實現中的鎖應用)。
AMQP(Advanced Message Queue Protocol)定義了一種消息系統規范。這個規范描述了在一個分布式的系統中各個子系統如何通過消息交互。
07 Log4j
參考博文:http://blog.csdn.net/u013142781/article/category/6045728
日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。
08 Ehcache
參考博文:http://blog.csdn.net/u013142781/article/category/6066337
EhCache 是一個純Java的進程內緩存框架,具有快速、精干等特點,是Hibernate中默認的CacheProvider。Ehcache是一種廣泛使用的開源Java分布式緩存。主要面向通用緩存,Java EE和輕量級容器。它具有內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點。
優點:
- 快速
- 簡單
- 多種緩存策略
- 緩存數據有兩級:內存和磁盤,因此無需擔心容量問題
- 緩存數據會在虛擬機重啟的過程中寫入磁盤
- 可以通過RMI、可插入API等方式進行分布式緩存
- 具有緩存和緩存管理器的偵聽接口
- 支持多緩存管理器實例,以及一個實例的多個緩存區域
- 提供Hibernate的緩存實現
缺點:
- 使用磁盤Cache的時候非常占用磁盤空間:這是因為DiskCache的算法簡單,該算法簡單也導致Cache的效率非常高。它只是對元素直接追加存儲。因此搜索元素的時候非常的快。如果使用DiskCache的,在很頻繁的應用中,很快磁盤會滿。
- 不能保證數據的安全:當突然kill掉java的時候,可能會產生沖突,EhCache的解決方法是如果文件沖突了,則重建cache。這對于Cache數據需要保存的時候可能不利。當然,Cache只是簡單的加速,而不能保證數據的安全。如果想保證數據的存儲安全,可以使用Bekeley DB Java Edition版本。這是個嵌入式數據庫。可以確保存儲安全和空間的利用率。
09 redis
參考博文:http://blog.csdn.net/u013142781/article/category/6067864
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。
在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
Redis數據庫完全在內存中,使用磁盤僅用于持久性。相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。Redis可以將數據復制到任意數量的從服務器。
1.2、Redis優點:
- 異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。
- 支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數據類型更好。
- 操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis服務器將獲得更新后的值。
- 多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發布/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。
1.3、Redis缺點:
- 單線程
- 耗內存
10 Shiro
參考博文:http://blog.csdn.net/u013142781/article/details/50629708
- Apache Shiro是Java的一個安全框架,旨在簡化身份驗證和授權。Shiro在JavaSE和JavaEE項目中都可以使用。它主要用來處理身份認證,授權,企業會話管理和加密等。Shiro的具體功能點如下:
- 身份認證/登錄,驗證用戶是不是擁有相應的身份;
- 授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶對某個資源是否具有某個權限;
- 會話管理,即用戶登錄后就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通JavaSE環境的,也可以是如Web環境的;
- 加密,保護數據的安全性,如密碼加密存儲到數據庫,而不是明文存儲;
- Web支持,可以非常容易的集成到Web環境;
- Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權限不必每次去查,這樣可以提高效率;
- shiro支持多線程應用的并發驗證,即如在一個線程中開啟另一個線程,能把權限自動傳播過去;
- 提供測試支持;
- 允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;
- 記住我,這個是非常常見的功能,即一次登錄后,下次再來的話不用登錄了。
文字描述可能并不能讓猿友們完全理解具體功能的意思。下面我們以登錄驗證為例,向猿友們介紹Shiro的使用。至于其他功能點,猿友們用到的時候再去深究其用法也不遲。
11 設計模式
這個算不上框架,可自行忽略,不過博主認為設計模式的思想很有必要了解一下。
參考博文:http://blog.csdn.net/u013142781/article/details/50816245 http://blog.csdn.net/u013142781/article/details/50821155 http://blog.csdn.net/u013142781/article/details/50825301
思想:
開閉原則:開閉原則就是說對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼。
針對接口編程,依賴于抽象而不依賴于具體。
盡量使用合成/聚合的方式,而不是使用繼承。
一個實體應當盡量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立。
使用多個隔離的接口,比使用單個接口要好。
里氏代換原則:子類的能力必須大于等于父類,即父類可以使用的方法,子類都可以使用。
返回值也是同樣的道理。假設一個父類方法返回一個List,子類返回一個ArrayList,這當然可以。如果父類方法返回一個ArrayList,子類返回一個List,就說不通了。這里子類返回值的能力是比父類小的。
還有拋出異常的情況。任何子類方法可以聲明拋出父類方法聲明異常的子類。
而不能聲明拋出父類沒有聲明的異常。