spring的AOP(二)----JDK動態代理
阿新 • • 發佈:2019-02-20
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();
}
}
執行結果: