1. 程式人生 > >spring的AOP(二)----JDK動態代理

spring的AOP(二)----JDK動態代理

JDK動態代理在1.3的時候引入,其底層需要依賴一個工具類java.lang.reflect.Proxy和一個介面java.lang.reflect.InvocationHandler

JDK 動態代理 必須基於 介面進行代理

這裡寫圖片描述

程式碼示例:
JdkProxyUtils.java

package com.my.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//對目標物件 建立 JDK 動態代理 (工具類)
public class JdkProxyUtils implements InvocationHandler { // 代理目標物件 private Object target; public JdkProxyUtils(Object target) { this.target = target; } //通過invoke呼叫 目標物件 方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable { System.out.println("執行JDK代理增強!!!!!!"); return method.invoke(target, args); // 呼叫目標物件方法 } // 為目標物件建立代理 public Object createProxy(){ // loader 目標物件類載入器 // interfaces 目標物件實現介面 // h 回撥物件,需要invocationhandler 執行目標物件方法 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this
); } }

UserDao.java

package com.my.jdkproxy;

//使用者操作介面
public interface UserDao {
    public void save();
    public void update();
    public void delete();

}

UserDaoImpl.java

package com.my.jdkproxy;

//使用者操作實現類
public class UserDaoImpl implements UserDao {

    @Override
    public void save() {
        System.out.println("儲存使用者。。。");
    }

    @Override
    public void update() {
        System.out.println("更新使用者。。。");
    }

    @Override
    public void delete() {
        System.out.println("刪除使用者。。。");
    }

}

Test.java

package com.my.jdkproxy;


public class Test {

    // 沒有代理程式設計
    @org.junit.Test
    public void demo1(){
        System.out.println("沒有代理程式設計");
        // 業務物件
        UserDao userDao = new UserDaoImpl();

        userDao.save();
        userDao.update();
        userDao.delete();

        System.out.println("----------------");
    }

    // 應用JDK動態代理
    @org.junit.Test
    public void demo2(){
        System.out.println();
        System.out.println("應用JDK動態代理");
        // 目標物件
        UserDao userDao = new UserDaoImpl();

        // 為目標物件 建立JDK動態代理
        JdkProxyUtils jdkProxyUtils = new JdkProxyUtils(userDao);// 傳入目標物件
        UserDao proxy = (UserDao) jdkProxyUtils.createProxy(); // 必須根據介面建立代理 

        // 呼叫代理物件方法
        proxy.save(); // 執行 InvocationHandler 的 invoke方法
        proxy.update();
        proxy.delete();

    }


}

執行結果:
這裡寫圖片描述