设计模式--动态代理模式

代理设计模式分为静态代理,jdk动态代理和cglib动态代理。

静态代理就是有明确存在的代理类,因其不易维护等缺点明显,所以不常用;

jdk动态代理原理是java的反射机制,缺点是被代理的对象必须实现接口;

cglib动态代理原理是asm字节码技术。比jdk动态代理应用广泛,推荐学习使用。

 

jdk动态代理:

UserDao接口类:

/**
 * mybatis dao层
 * @author pengqingwen
 *
 */
public interface UserDao {
	void save();
	void delete(int id);
	void update(int id,String name,String pwd,Date date);
}

UserDaoMysqlImpl接口实现类:

package com.pqw.proxy.demo;

import java.util.Date;

public class UserDaoMysqlImpl implements UserDao {

	@Override
	public void save() {
		System.out.println("Mysql执行保存...");
	}

	@Override
	public void delete(int id) {
		System.out.println("Mysql执行删除..."+id);
	}

	@Override
	public void update(int id, String name, String pwd, Date date) {
		System.out.println("Mysql执行修改...id:"+id+"name:"+name+"pwd:"+pwd+"date:"+date);
	}

}

代理类ProxyDemo:

package com.pqw.proxy.demo;

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

public class ProxyDemo {
	public Object obj;
	
	public ProxyDemo(Object obj) {
		super();
		this.obj = obj;
	}

	public  Object getTransactionProxyInstance(){
		Object proxy = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				System.out.println("开启事物");
				method.invoke(obj, args);
				System.out.println("结束事物");
				return proxy;
			}
		});
		return proxy;
	}
	
	
	
}

测试:

package com.pqw.proxy.demo;


public class Main {
	public static void main(String[] args) {
		UserDao userDao = new UserDaoMysqlImpl();
		UserDao userDaoProxy = (UserDao) new ProxyDemo(userDao).getTransactionProxyInstance();
		userDaoProxy.save();
	}
}

效果:

开启事物
Mysql执行保存...
结束事物

注:可以根据jdk动态代理方式手写mybatis

 

qq:1992093891

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值