Spring Boot AOP代理

AOP 代理的兩種實現:

  • jdk是代理接口,私有方法必然不會存在在接口裏,因此就不會被攔截到;
  • cglib是子類,private的方法照樣不會出如今子類裏,也不能被攔截。

Java 動態代理。

具體有以下四步驟:html

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

GCLIB代理

cglib(Code Generation Library)是一個強大的,高性能,高質量的Code生成類庫。它能夠在運行期擴展Java類與實現Java接口。java

  • cglib封裝了asm,能夠在運行期動態生成新的class(子類)。
  • cglib用於AOP,jdk中的proxy必須基於接口,cglib卻沒有這個限制。

原理區別:

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

  1. 若是目標對象實現了接口,默認狀況下會採用JDK的動態代理實現AOP
  2. 若是目標對象實現了接口,能夠強制使用CGLIB實現AOP
  3. 若是目標對象沒有實現了接口,必須採用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換

在Spring Boot中咱們能夠經過配置文件制定代理類型。github

#開啓對AOP的支持
spring.aop.auto=true
#設置代理模式 true(cglib) false(java JDK代理)
spring.aop.proxy-target-class=true

Spring Boot事務默認是使用的cglib代理,能夠經過上面的方式去指定代理模式。spring

源碼:https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases函數

spring-boot-student-data-jpa-transaction 工程spring-boot

參考: http://www.cnblogs.com/fenglie/articles/4097759.html性能

相關文章
相關標籤/搜索