Spring AOP /代理模式/事務管理/讀寫分離/多數據源管理

參考文章:html

http://www.cnblogs.com/MOBIN/p/5597215.htmljava

http://www.cnblogs.com/fenglie/articles/4097759.html算法

http://blog.csdn.net/arthur0088/article/details/5377736spring

http://www.xuebuyuan.com/324257.html數據庫

http://blog.csdn.net/dreamthen/article/details/26687727設計模式

 

 

設計模式、框架源碼、編寫底層框架框架

1.代理模式

做用:

以非侵入式的方式,爲某個或某類方法實行加強。即不須要修改原來的類和方法,便可在調用某方法以前或以後,添加新的功能。函數

實現方式:

靜態代理(預先寫好代理類),缺點不靈活. a.代理類和委託類實現了相同的接口,致使委託類新增方法的時候,代理類代碼也要修改。b.代理對象只服務於一種類型的對象,即一個代理類智能代理一個接口,而動態代理能夠代理一組接口。性能

動態代理,JDK動態代理cglib 動態代理.java動態代理是利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。而cglib動態代理是利用asm開源包,對代理對象類的class文件加載進來,經過修改其字節碼生成子類來處理。ui

JDK動態代理實現原理,

  1. 經過實現 InvocationHandler 接口建立本身的調用處理器;
  2. 經過爲 Proxy 類指定 ClassLoader 對象和一組 interface 來建立動態代理類;
  3. 經過反射機制得到動態代理類的構造函數,其惟一參數類型是調用處理器接口類型;
  4. 經過構造函數建立動態代理類實例,構造時調用處理器對象做爲參數被傳入。

簡單來講, 經過InvocationHandler 接口建立本身的調用處理器,而後經過經過Proxy 類和反射機制,來建立動態代理類實例。

方法一:

方法二:將2~4步驟封裝好的簡便方法來建立動態代理對象

 

2.Spring AOP 原理

 spring AOP 可使用JDK動態代理 或cglib 動態代理。默認JDK動態代理。如何選擇?從靈活性,cglib更靈活能夠代理接口,也能夠代理類。可是cglib須要引入新的包,並且JDK動態代理性能更好。並且代碼也習慣用接口來作。因此仍是選用了JDK動態代理。

 

切入點,通知。切面

在選擇JDK動態代理狀況下,spring 就是使用InvokeHandler和PROXY類實現的。切入點,就是委託類要進行加強的方法。通知就是具體的加強方法。而InvokeHandler處理器,至關於就是切面,切面裏面能夠加入先後通知。

3.事務管理、底層jdbc框架、多數據源、數據庫讀寫分離。

基礎事務管理:

聲明式事務,對業務層方法實現AOP切面,負責管理事務。事務開啓管理,傳播機制等等。

多數據源管理:

再定一個切面,對業務層這個切入點,增長一個切面來進行數據源管理。注:同一個切入點的不一樣切面的執行順序,須要經過ORDER參數來保證,必須讓數據源管理在事務管理以前。

a.讀寫庫分離

b.讀庫的均衡策略 :簡單辦法 。 使用AtomicInteger 自增取餘的hash算法,來均衡請求。

c.外部數據源的選擇

read-only,只讀事務管理:(可忽略,可直接聲明式事務爲SUPPORTS,而不適用read-only配置)

因爲使用的是spring的DataSourceTransactionManager,不是HibernateTransactionManager。裏面對聲明式事務配置的 read-only沒作處理。致使對只讀事務,使用的事務傳播性是required.而這些讀方法不須要進行開啓事務,讓費了資源。

作法:在多數據源管理的切面類,實現BeanPostProcessor接口,便可在相應bean被ico實例化後作統一處理,設置read-only的方法的事務傳播性爲SUPPORTS.

相關文章
相關標籤/搜索