當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring 初识Aop JDK动态代理实现 原理初显
生活随笔
收集整理的這篇文章主要介紹了
Spring 初识Aop JDK动态代理实现 原理初显
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Spring 初識Aop JDK動態代理實現 原理初顯
- 一、項目結構
- 二、具體步驟:
- 1、創建maven項目 創建好包結構
- 2、寫一個TestDao接口 及實現類
- 3、 寫一個自己的切面類
- 4、java JDK 實現動態代理
- 5、JDK 動態代理測試
- 6、Cglib 實現動態代理
- 7、Cglib 測試
- 三、自言自語
Spring-AOP-理論知識
一、項目結構
二、具體步驟:
1、創建maven項目 創建好包結構
2、寫一個TestDao接口 及實現類
/*** @version 1.0* @author: crush* @date: 2021-03-05 10:26*/ public interface TestDao {public void sayHello();public void save();public void modify();public void delete(); }TestDaoImpl
/*** @version 1.0* @author: crush* @date: 2021-03-05 10:27*/ @Repository public class TestDaoImpl implements TestDao {public void sayHello() {System.out.println("武漢加油!中國加油!");}public void save() {System.out.println("保存");}public void modify() {System.out.println("修改");}public void delete() {System.out.println("刪除");} }3、 寫一個自己的切面類
/*** @version 1.0* @author: crush* @date: 2021-03-10 11:41*/ public class MyAspect {public void check(){System.out.println("模擬權限處理");}public void except(){System.out.println("模擬異常處理");}public void log(){System.out.println("模擬日志記錄");}public void monitor(){System.out.println("性能檢測");} }4、java JDK 實現動態代理
/*** @version 1.0* @author: crush* @date: 2021-03-10 11:47** InvocationHandler是由代理實例的調用處理程序實現的接口。* 每個代理實例都有一個關聯的調用處理程序。* 在代理實例上調用方法時,該方法調用將被編碼并分派到其調用處理程序的invoke方法*/ public class JdkDynamicProxy implements InvocationHandler {private Object object;/*** @Date 16:24 2021/3/10** 創建代理的方法 建立代理對象和真實對象的代理關系 并返回代理對象**/public Object createProxy(Object object){this.object=object;// 1、 類加載器ClassLoader classLoader = JdkDynamicProxy.class.getClassLoader();// 2、 被代理對象 實現的所有接口Class[] interfaces = object.getClass().getInterfaces();// 3、 使用代理類進行增強 返回代理后的對象/*** 利用Java的反射技術(Java Reflection),* 在運行時創建一個實現某些給定接口的新類(也稱“動態代理類”)及其實例(對象),* 代理的是接口(Interfaces),不是類(Class),也不是抽象類。* 在運行時才知道具體的實現,spring aop就是此原理*/return Proxy.newProxyInstance(classLoader,interfaces,this);/*** newProxyInstance,方法有三個參數:** loader: 用哪個類加載器去加載代理對象** interfaces:動態代理類需要實現的接口** h:動態代理方法在執行時,會調用h里面的invoke方法去執行*/}/*** @Param [proxy 是被代理的對象,* method 是將要被執行的方法,* args 是執行方法 時需要的參數]* @return java.lang.Object** 處理代理實例上的方法調用并返回結果。在與之關聯的代理實例上調用方法時,將在調用處理程序上調用該方法。** invoke 三個參數* proxy:就是代理對象,newProxyInstance方法的返回對象** method:調用的方法** args: 方法中的參數**/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {MyAspect myAspect = new MyAspect();myAspect.check();myAspect.except();// 在目標類上調用方法并傳入參數 相當于調用testDao中的方法Object obj = method.invoke(object, args);myAspect.log();myAspect.monitor();return obj;} }5、JDK 動態代理測試
@Testpublic void JdkDynamicTest(){//創建代理對象JdkDynamicProxy proxy = new JdkDynamicProxy();//創建目標對象TestDao testDao = new TestDaoImpl();/*** 從代理對象中獲取到增強后的目標對象,* 該對象是一個被代理的對象* 它會進入到代理的邏輯方法 invoke 中*/TestDao testAdvice = (TestDao) proxy.createProxy(testDao);// 執行方法testAdvice.sayHello();}6、Cglib 實現動態代理
/*** @version 1.0* @author: crush* @date: 2021-03-10 16:23*/ public class CglibDynamicProxy implements MethodInterceptor {/*** @Param [o, method, objects, methodProxy]* 創建代理的方法 生成CGLIB代理對象* target 是目標對象 需要增強的對象* 返回目標對象的CGLIB 代理對象**/public Object creatProxy(Object target){// 創建一個動態類對象 即增強類對象Enhancer enhancer = new Enhancer();// 確定需要增強的類 設置其父類//超類 – 要擴展的類或要實現的接口enhancer.setSuperclass(target.getClass());// 確定代理邏輯對象為當前對象// 要求當前對象實現MethodInterceptor 的方法enhancer.setCallback(this);// 返回創建的代理對象return enhancer.create();}/*** @Param [o, method, objects, methodProxy]* intercept 方法慧再程序執行目標方法時被調用* proxy 是CGLIB 根據指定父類生成的代理對象* method 是攔截方法* args 是攔截方法的參數數組* methodProxy 是方法代理對象 擁有執行父類的方法 返回代理結果**/@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {MyAspect myAspect = new MyAspect();myAspect.check();myAspect.except();// 在目標類上調用方法并傳入參數 相當于調用testDao中的方法Object obj = methodProxy.invokeSuper(proxy, args);myAspect.log();myAspect.monitor();return obj;} }7、Cglib 測試
@Testpublic void CglibDynamicProxyTest(){// 創建代理對象CglibDynamicProxy proxy = new CglibDynamicProxy();// 創建目標對象TestDao testDao = new TestDaoImpl();//獲取增強后的目標對象TestDao testAdvice = (TestDao) proxy.creatProxy(testDao);//執行方法testAdvice.save();}三、自言自語
又到一天中課間休息時間拉。
再看張好看的圖。欣賞來自大自然的美麗。
總結
以上是生活随笔為你收集整理的Spring 初识Aop JDK动态代理实现 原理初显的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring AOP(一) AOP基本概
- 下一篇: Spring-Aop-XML实现