日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring的AOP-底层原理

發布時間:2024/7/23 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring的AOP-底层原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1.有兩種動態代理

第一種:有接口情況,使用JDK動態代理

第二種:無接口情況,使用CGLIB動態代理

2.使用JDK動態代理,使用Proxy類里面的方法創建代理對象

步驟一:

步驟二:

步驟三:

3.編寫JDK動態代理代碼

(1)創建接口,定義方法

(2)創建接口實現類,實現方法

(3)使用Proxy類創建接口代理對象

測試結果:


?

Spring的AOP-底層原理

?

1.有兩種動態代理

第一種:有接口情況,使用JDK動態代理

步驟:創建接口實現類代理對象,增強類的方法

?

第二種:無接口情況,使用CGLIB動態代理

步驟:創建子類的代理對象,增強類的方法

?

2.使用JDK動態代理,使用Proxy類里面的方法創建代理對象

步驟一:

打開JDK8? 的開發文檔查看的proxy類

?

步驟二:

往下拉找到一個方法:

?

步驟三:

調用 newProxyInstance 方法實現JDK動態代理

分析這個方法:

newProxyInstance(ClassLoader?loader,?類<?>[]?interfaces,?InvocationHandler?h)

方法有三個參數:

第一個參數?ClassLoader?loader:得到類加載器

第二個參數?類<?>[]?interfaces:增強方法所在的類,這個類實現的接口,支持多個接口(因為[]代表的是數組)

第三個參數?InvocationHandler?h:實現這個接口?InvocationHandler,創建代理對象,寫增強的方法

?

3.編寫JDK動態代理代碼

(1)創建接口,定義方法

package com.lbj.spring5;public interface UserDao {public int add(int a,int b);public String update(String id); }

?

(2)創建接口實現類,實現方法

package com.lbj.spring5;public class UserDaoImpl implements UserDao{@Overridepublic int add(int a, int b) {System.out.println("add方法執行");return a+b;}@Overridepublic String update(String id) {System.out.println("update方法執行");return id;} }

?

明確我們要做什么:通過動態代理的方式,add()方法和update()方法做個增強

?

(3)使用Proxy類創建接口代理對象

代理對象需要傳遞到代理類中 ,類代理對象是UserDao的實現類

UserDaoImpl中的add()方法需要被增強 ,所以需要把UserDaoImpl的對象傳遞到代理類中

package com.lbj.spring5;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays;public class JDKProxy {public static void main(String[] args) {//創建接口實現類代理對象Class[] interfaces={UserDao.class};//相當于new了一個接口實現類,賦予接口,且這個實現類叫代理類UserDaoImpl userDaoImpl=new UserDaoImpl();//傳入對象userDaoImpl//返回代理對象// Object o = Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDaoImpl));//強轉,接口等于實現類的代理對象UserDao userDao =(UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDaoImpl));int result = userDao.add(1, 2);System.out.println("result:"+result);}}//創建代理對象代碼 class UserDaoProxy implements InvocationHandler{//1.把被代理對象傳遞進來//如何傳遞:通過有參構造傳遞private Object object;public UserDaoProxy(Object object){this.object=object;}//增強的邏輯@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法之前System.out.println("方法執行之前....."+method.getName()+":傳遞的參數"+ Arrays.toString(args));//被增強的方法執行Object res=method.invoke(object,args);//方法之后System.out.println("方法之后執行...."+object);return res;} }

測試結果:

?

?

?

?

?

?

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Spring的AOP-底层原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。