參考文章: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設計模式
設計模式、框架源碼、編寫底層框架框架
以非侵入式的方式,爲某個或某類方法實行加強。即不須要修改原來的類和方法,便可在調用某方法以前或以後,添加新的功能。函數
靜態代理(預先寫好代理類),缺點不靈活. a.代理類和委託類實現了相同的接口,致使委託類新增方法的時候,代理類代碼也要修改。b.代理對象只服務於一種類型的對象,即一個代理類智能代理一個接口,而動態代理能夠代理一組接口。性能
動態代理,JDK動態代理cglib 動態代理.java動態代理是利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。而cglib動態代理是利用asm開源包,對代理對象類的class文件加載進來,經過修改其字節碼生成子類來處理。ui
JDK動態代理實現原理,
簡單來講, 經過InvocationHandler 接口建立本身的調用處理器,而後經過經過Proxy 類和反射機制,來建立動態代理類實例。
方法一:
方法二:將2~4步驟封裝好的簡便方法來建立動態代理對象
spring AOP 可使用JDK動態代理 或cglib 動態代理。默認JDK動態代理。如何選擇?從靈活性,cglib更靈活能夠代理接口,也能夠代理類。可是cglib須要引入新的包,並且JDK動態代理性能更好。並且代碼也習慣用接口來作。因此仍是選用了JDK動態代理。
切入點,通知。切面
在選擇JDK動態代理狀況下,spring 就是使用InvokeHandler和PROXY類實現的。切入點,就是委託類要進行加強的方法。通知就是具體的加強方法。而InvokeHandler處理器,至關於就是切面,切面裏面能夠加入先後通知。
聲明式事務,對業務層方法實現AOP切面,負責管理事務。事務開啓管理,傳播機制等等。
再定一個切面,對業務層這個切入點,增長一個切面來進行數據源管理。注:同一個切入點的不一樣切面的執行順序,須要經過ORDER參數來保證,必須讓數據源管理在事務管理以前。
a.讀寫庫分離
b.讀庫的均衡策略 :簡單辦法 。 使用AtomicInteger 自增取餘的hash算法,來均衡請求。
c.外部數據源的選擇
因爲使用的是spring的DataSourceTransactionManager,不是HibernateTransactionManager。裏面對聲明式事務配置的 read-only沒作處理。致使對只讀事務,使用的事務傳播性是required.而這些讀方法不須要進行開啓事務,讓費了資源。
作法:在多數據源管理的切面類,實現BeanPostProcessor接口,便可在相應bean被ico實例化後作統一處理,設置read-only的方法的事務傳播性爲SUPPORTS.