在理解jdk的动态代理前,我们先理解下什么是模式,设计模式;
模式:在我们身边重复发生的问题,以及解决这些问题的方案和核心内容。
设计模式:软件设计过程中,涉及到的常用问题,以及解决这些问题的方案和核心内容
目的:为一个对象提供一个代理以控制对这个对象的访问。
问题描述:以添加用户为例,利用代理模式创建的代理对象,产生一个crud对象
解决:引入代理模式。
代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理
public class UserServiceProxy {
private IUserService target;//目标对象是一个service 对象
//返回的
public IUserService getProxyInstance() {
//使用JDK中的Proxy类的newProxyInstance方法创建代理对象
//newProxyInstance方法的第一个参数,获得类的加载器,第二个参数目标对象实现过的接口类型,第三个参数代理行为, //
return (IUserService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName()+"-->"+args[0]);
System.out.println("获得连接");
if(!method.getName().startsWith("select")){
System.out.println("获得开启事务");
}
//执行目标对象的方法 获取返回值
Object obj =method.invoke(target, args);
//根据方法开启或结束事务
if(!method.getName().startsWith("select")){
System.out.println("结束事务");
}
System.out.println("关闭连接");
return obj;
}
});
// 使用jdk中的proxy类的newProxyInstance方法创建代理对象
}
}
调用:
public class Test {
public static void main(String[] args) {
User user = new User();
user.setUsername("zs");
user.setPassword("123");
List<UserRole> list = new ArrayList<UserRole>();
UserRole role = new UserRole();
list.add(role);
user.setRoles(list);
//创建Dao对象
UserDao userdao = new UserDao();
UserRoleDao roleDao =new UserRoleDao();
//创建service对象(目标对象)
UserService service= new UserService();
service.setUserdao(userdao);
service.setUserroledao(roleDao);
//创建代理对象
UserServiceProxy proxy = new UserServiceProxy();
proxy.setTarget(service);
IUserService p = proxy.getProxyInstance();
//又代理产生的service 调用方法
p.addUser(user);
p.deleteUser(user);
p.updateUser(user);
p.selectUser(user);
}
}