了解代理模式
2017-09-24 11:37
344 查看
1.建立一个接口类和实现类
package cn.mldn.dao; import cn.mldn.vo.User; import java.util.List; /** * Created by wq on 2017/9/18. */ public interface IUserDAO { public void doCreate(User vo) throws Exception; public void doUpdate(User vo) throws Exception; public void doRemove(String name) throws Exception; public User findByName(String name) throws Exception; public List<User> findAll() throws Exception; }
package cn.mldn.dao.impl; import cn.mldn.dao.IUserDAO; import cn.mldn.vo.User; import java.util.List; /** * Created by wq on 2017/9/18. */ public class UserDAOImpl implements IUserDAO { @Override public void doCreate(User vo) throws Exception { System.out.println("【增加数据:doCreate】"+vo); } @Override public void doUpdate(User vo) throws Exception { System.out.println("【修改数据:doUpdate】"+vo); } @Override public void doRemove(String name) throws Exception { System.out.println("【删除数据:doRemove】"+name); } @Override public User findByName(String name) throws Exception { System.out.println("【查询数据:findByName】"+name); return null; } @Override public List<User> findAll() throws Exception { System.out.println("【查询数据:findAll】"); return null; } }2.建立代理类
package cn.mldn.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Created by wq on 2017/9/23. */ public class DAOProxy implements InvocationHandler{ private Object target; //要代理的对象信息 //需要由系统生产一个指定接口的代理类对象 public Object bind(Object target){ this.target=target; //返回与当前传入对象结构相同的代理对象 return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //取得当前执行的方法的名称 this.log(method.getName()); Object retObj = method.invoke(this.target,args); //如果是更新则进行事物处理 if (method.getName().matches("do[a-zA-Z0-9]+")){ this.commit(); } return retObj; } public void log(String methodName){ System.out.println("进行日志记录 ,方法:"+methodName); } public void commit(){ System.out.println("事务提交。"); } }3.建立代理测试类
package cn.mldn.test; import cn.mldn.dao.IUserDAO; import cn.mldn.dao.impl.UserDAOImpl; import cn.mldn.dao.proxy.UserDAOProxy; /** * Created by wq on 2017/9/17. */ public class ProxyDemo { public static void main(String[] args ) throws Exception { IUserDAO dao=(IUserDAO) new UserDAOProxy().bind(new UserDAOImpl()); dao.doCreate(null); dao.findByName("hello"); } }
传入的是接口,如果没有接口则会出现错误 所以用cglib包进行设计
以下是:
代理测试类
package cn.mldn.test;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** Created by wq on 2017/9/24.*/class Hello{public void print(){System.out.println("中午了,肚子饿了吧?听晕了不");}}public class CGLIBProxyDemo {public static void main(String[] args ) throws Exception {final Hello hello = new Hello();//代理类对象Enhancer enhancer = new Enhancer();//为代理类设置一个父类enhancer.setSuperclass(Hello.class);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("******************");return method.invoke(hello,objects);}});//返回代理类对象Hello temp= (Hello) enhancer.create();temp.print();}}
成功:
本案例导入的包为cglib-2.1.3.jar
和asm.jar 已经上传自行下载
相关文章推荐
- 对代理模式中代理方法实现和调用的简单了解
- 你真的了解iOS代理设计模式吗?
- 你真的了解iOS代理设计模式吗?
- 你真的了解iOS代理设计模式吗?
- 你真的了解iOS代理设计模式吗?
- 代理模式之虚拟代理(仅了解)
- 你真的了解iOS代理设计模式吗?
- 简单了解spring中用到的代理模式
- 学习spring前,先了解了解代理模式
- 你真的了解iOS代理设计模式吗?
- 你真的了解iOS代理设计模式吗?
- 【Java千问】你了解代理模式吗?
- 你真的了解iOS代理设计模式吗?
- ios代理模式深入了解一下
- 你敢说你真的了解 代理设计模式??
- 代理模式轻松入门
- java设计模式之代理模式
- 设计模式(十): 代理模式
- Java设计模式 之 代理模式
- 设计模式之代理模式