使用JDK中的InvocationHandler、Proxy实现动态代理

动态代理(Dynamic Proxy)

一、切面编程(在方法前后加上一些逻辑,如下:在save(User user)方法前后加逻辑)
准备工作:
public class UserDAOImpl {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

1、实现方法一:直接在方法里面逻辑前后进行添加
public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user start");   //在方法前添加逻辑
		System.out.println("user saved!");
	}
}

2、实现方法二:使用继承进行添加
public class UserDAOImpl2 extends UserDAOImpl {
	@Override
	public void save(User user) {
		System.out.println("user start");   //在方法前添加逻辑
		super.save(user);
	}
}

3、实现方法三:使用接口进行添加
添加接口UserDAO
public interface UserDAO {
	public void save(User user);
}

让UserDAOImpl继承接口
public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

让UserDAOImpl2继承接口
public class UserDAOImpl2 implements UserDAO {
	
	private UserDAOImpl userDAOImpl = new UserDAOImpl();
	
	public void save(User user) {
		System.out.println("user start");   //在方法前添加逻辑
		userDAOImpl.save(user);
	}
}

小总结:三种方法中,使用接口和组合最为合适,但是如果要添加逻辑的方法十分多,而且因继承接口而形成的结构十分复杂的时候,可以使用动态代理来帮助实现。
二、使用动态代理添加逻辑
将所需要添加的逻辑封装成一个类,让其继承InvocationHandler接口
public class LogInterceptor implements InvocationHandler {

	private Object target;  //需要添加逻辑的对象
	
	public LogInterceptor(Object target) {
		this.target = target;
	}
	
	public void log(Method m) {
		System.out.println(m.getName() + " start");
	}

	/*
	 * proxy 代理对象
	 * method 代理对象要执行的方法
	 * args 所需执行方法的参数
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		log(method);    //在执行方法前添加逻辑
		method.invoke(target , args);
		return null;
	}

}

使用Proxy获得代理对象,代理对象与被代理对象要实现同样的接口
public class TestProxy {
	/*
	 * userDAO 要代理的对象,实现了UserDAO接口
	 * li 给代理添加逻辑的类
	 * proxy 通过Proxy的静态方法生成的代理对象
	 * 代理对象与被代理的对象的ClassLoader要一样
	 * 通过传入的参数,实现与代理对象同样的接口
	 */
	public void testProxy() {
		UserDAO userDAO = new UserDAOImpl();
		LogInterceptor li = new LogInterceptor(userDAO);  
		UserDAO proxy = (UserDAO)Proxy.newProxyInstance(
				userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li);
		proxy.save(new User());
		proxy.delete();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值