Spring(八)-- 代理设计模式
代理设计模式
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();
}
}
未完待续!!!
Spring(八)-- 代理设计模式的更多相关文章
- Spring知识点总结(四)之SpringAOP基础 - 代理设计模式
1. 分析程序中存在的问题(高内聚,低耦合) 通过springIOC DI) 以及注解的使用,成功解决了在程序中层与层之间出现的耦合的问题,但是在很多地方仍然存在非该层应该实现的 ...
- Spring中的设计模式
[Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用] [http://www.geek521.c ...
- 代理设计模式 (静态代理设计模式)+ 动态代理(JDK和Cglib)
一.代理设计模式 1.设计模式:前人总结一套解决特定问题的代码 2.代理设计模式优点: 2.1 保护真实对象 2.2 让真实对象职责更明确 2.3 扩展 3.代理设计模式 3.1 真实对象(老总) 3 ...
- JAVA-Spring AOP基础 - 代理设计模式
利用IOC DI实现软件分层,虽然解决了耦合问题,但是很多地方仍然存在非该层应该实现的功能,造成了无法“高内聚”的现象,同时存在大量重复的代码,开发效率低下. @Service public clas ...
- Java设计模式之——代理设计模式
1.什么是代理设计模式 所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 这里举一个栗子:就拿我们平时租房子来举例子,好比租客和房主之间的关系,我们租房子往往不 ...
- JDK和Spring中的设计模式
创建型 1)工厂方法 Collection.iterator() 由具体的聚集类来确定使用哪一个Iterator 2)单例模式 Runtime.getRuntime() 3)建造者模式 StringB ...
- IOS之Objective-C学习 代理设计模式
鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式. 代理,又称委托,delegation. 代理模式可以让一个单继承的类实现父类以外其他类的方法. ...
- 你真的了解iOS代理设计模式吗?
在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大 ...
- Objective-C之代理设计模式小实例
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- Harbor ($docker login) Error saving credentials
$ sudo apt-get install $ sudo apt-get install gnupg2 pass 问题解决!
- 织梦dedecms做的网站首页标题篡改跳转赌博网站解决方案
织梦dedecms因其强大功能,简单实用的优点常常被用来做企业网站,程序开源使用的人多了网站漏洞多会有中毒的情况,常见的有一种,首页标题关键词描述被篡改,百度快照收录点击后跳转的赌博网站,怎么解决这个 ...
- vscode存盘时格式化
1.文件->首选项->设置
- Spring MVC 的 multipartResolver 不能同iWebOffice2006 共同使用
转:http://jamesby.iteye.com/blog/57381 项目使用iWebOffice2006,本来可以正常使用,但是系统有文件上传需求,故定义了一个multipartResolve ...
- python 数据库更新操作
数据库更新操作 更新操作用于更新数据表的的数据,以下实例将 EMPLOYEE 表中的 SEX 字段为 'M' 的 AGE 字段递增 1: #!/usr/bin/python # -*- coding: ...
- 在window环境下安装numpy模块(包)
刚开始接触python,安装numpy着实费了不少劲.总结一下,新人少走弯路. numpy作用: 是一个 Python 包. 它代表 “Numeric Python”. 它是一个由多维数组对象和用于处 ...
- 浏览器使用小tip
谷歌浏览器截取长图 很多网页长图单个页面截不下来,那么需要如何解决? 首先,在谷歌浏览器chrome中打开需要截图的网页,等待需要截图的网页打开完毕,然后按F12 打开开发者工具,然后按组合键 Ctr ...
- Topcoder SRM 674 Div.2题解
T1 解题思路 这题应该不是很难,主要是题意理解问题. 注意给出的两个数组里映射关系已经对应好了,只要判断是否为双射即可 参考程序 #include <bits/stdc++.h> usi ...
- HDU 6089 Rikka with Terrorist (线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6089 题解 这波强行维护搞得我很懵逼... 扫描线,只考虑每个点能走到左上方(不包括正上方,但包括正左 ...
- Oracle根据连续性日期的重复数据取最大或最小值日期
原始数据: 结果数据: 对比两个图,要是不处理连续性中的重复值,我们直接可以用LEAD函数了事,但处理出来的结果貌似多余. 我的思路是先将原始数据中连续性日期有重复值的处理好,即选择最小的一个,比如2 ...