代理设计模式分为静态代理,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