回覆列表
  • 1 # 哥是個傳說

    要想明白在Java中怎麼使用動態代理面向切面程式設計,首先你需要明白代理的含義以及為什麼要使用代理。

    代理是Java語言中的一種設計模式,俗稱代理模式。代理模式實現可以分為靜態代理和動態代理。靜態代理和動態代理的區別在於動態代理中,代理類並不是在Java程式碼中實現,而是在執行時期生成,相比靜態代理,動態代理可以很方便的對委託類的方法進行統一處理,如新增方法呼叫次數、新增日誌功能等等。Java中代理的使用一般都是把公用或者共同的東西抽取出來,而遮蔽物件中未開放的介面和方法,即多個程式碼塊即可以執行該重構的方法,又無需在程式中,以硬編碼的方法直接呼叫該方法。

    動態代理分為jdk動態代理和cglib動態代理,區別從檔案數上來說,cglib比jdk實現的少了個介面類。因為cglib返回的代理物件是目標物件的子類。而jdk產生的代理物件和目標物件都實現了一個公共介面。

    * jdk的動態代理 * 代理物件和目標物件實現了共同的介面 * 攔截器必須實現InvocationHanlder介面 * cglib的動態代理 * 代理物件是目標物件的子類 * 攔截器必須實現MethodInterceptor介面 * hibernate中session.load採用的是cglib實現的

    jdk動態代理模式裡面有個攔截器的概念,在jdk中,只要實現了InvocationHandler這個介面的類就是一個攔截器類。還使用了些反射的相關概念。攔截器的概念不瞭解沒關係,假如寫了個請求到action,經過攔截器,然後才會到action。然後繼續有之後的操作。攔截器就像一個過濾網,一層層的過濾,只要滿足一定條件,才能繼續向後執行。

    攔截器的具體操作步驟:1.引入類:目標類和一些擴充套件方法相關的類。2.賦值:呼叫建構函式給相關物件賦值。3.合併邏輯處理:在invoke方法中把所有的邏輯結合在一起。最終決定目標方法是否被呼叫。

    cglib動態代理和jdk動態代理差不多,只不過是spring框架使用而已,攔截器實現的是MethodInterceptor介面。

  • 中秋節和大豐收的關聯?
  • 成本支出高於收入增長,Netflix是否正在走下坡路?