Spring(八)-- 代理设计模式
2018-09-18 06:35:50来源:博客园 阅读 ()
代理设计模式
1:基本概念
2:JDK动态代理
1. 创建接口
2. 创建实现类
3. 创建代理类
/** * jdk动态代理 不能满足 继承父类的情况 * * AnimalProxy 代理类 */ public class AnimalProxy implements InvocationHandler{ /** * 这里绝对不能使用Dog! 因为我们压根不知道谁是委托类 */ private Object object; /** * 给我传递一个委托类,我们返回一个代理类 */ public Object createProxy(Object target){ this.object=target; //传递dog 委托类就是dog 传递什么 委托类是什么 return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } /** * 代理类给委托类 工作的方法 * 给 主业务增强 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("====洗洗手===="); Object result= method.invoke(object,args); //有返回值 使用变量接收 System.out.println("====再次洗洗手===="); return result; } //测试代码 public static void main(String[] args) { AnimalProxy proxy=new AnimalProxy(); Animal dog= (Animal) proxy.createProxy(new Dog()); dog.eat(); System.out.println("*********************"); dog.sleep(); } }
问题:
如果我们上诉案例中的Animal改成了 抽象类,
Dog改成了继承Animal,那么测试代码将会出现错误!
因为JDK动态代理 只支持接口!那么我们就使用CGLIB动态代理!
3:CGLIB动态代理
/** * CglibProxy 代理类 (接口 + 类) */ public class CglibProxy implements MethodInterceptor { private Enhancer enhancer=new Enhancer(); /** * 创建代理类对象 */ public Object createProxy(Class clazz){ //设置公共的接口或者父类 enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } /** * 代理类执行 委托类的 方法 * 系统级业务进行增强 */ public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("====洗洗手===="); Object result= methodProxy.invokeSuper(o,args); System.out.println("====再次洗洗手===="); return result; } //测试代码 public static void main(String[] args) { CglibProxy proxy=new CglibProxy(); Animal dog= (Animal) proxy.createProxy(new Dog().getClass()); dog.eat(); System.out.println("*********************"); dog.sleep(); } }
未完待续!!!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:【MAC】安装神器brew
- Spring系列.ApplicationContext接口 2020-06-11
- 代理项 Surrogate 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash