天天看點

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

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

JDK 動态代理 必須基于 接口進行代理

spring的AOP(二)----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();
		
	}
	

}

           

運作結果:

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