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; } ...
随机推荐
- mysql报错:Cause: java.sql.SQLException: sql injection violation, syntax error: ERROR. pos 39, line 2, column 24, token CLOSE
因为close是mysql关键字 -- ::, DEBUG (BaseJdbcLogger.java:)- ==> Preparing: , -- ::, INFO (XmlBeanDefini ...
- C# socket异步 服务端
转自: http://blog.csdn.net/qq_20282263/article/details/54310737 private Dictionary<string, Session ...
- Jmeter -- 添加断言,及断言结果
步骤: 1. 添加响应断言(添加-断言-响应断言) Add --> Assertions --> Response Assertion 2. 配置断言 判断响应内容中,是否包含关键字“禅 ...
- 大哥带的DOM-XSS进阶eval构造XSS
0X01源码分析 那么我们可以如何来构造语法呐??已知eval函数可以执行js 最终的输出是eval(this.xss="你提交的参数";) 那我们是不是可以从参数这里构造一个js ...
- git多人参与的项目 -> 分支代码如何合并到主干
个人理解:合并分支时候就是当前分支,与别的分支先合并一遍,然后解决分支中存在的所有冲突,之后将本地分支代码提交到git远程仓库,之后切换主干分支 ,将主干分支与分支内容合并,解决冲突, 在提交主干分支 ...
- MQ常问的问题
目录 1:什么场景使用了mq?直接掉接口不行吗? 2:用消息队列都有什么优点和缺点? 3:Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别? 4:那你们是如何保证消息队列 ...
- 搜狗输入法弹窗搜狐新闻的处理 以及sogoucloud.exe的处理
https://www.cnblogs.com/Asa-Zhu/p/3359034.html 使用everything搜索SohuNews.exe,然后找到安装路径C:\Program Files ( ...
- sqlserver2012语法
1.SQL Server 2012 Format()方法 SQL Server 从 2012 开始增加了Format方法,可以使用 Format来格式化日期与数字,而且和 C# 里的日期格式化一致,语 ...
- oracle11g RMAN catalog的基本使用
编辑 /etc/hosts文件 tnsnames.ora文件 创建SQL> create tablespace ts_rman_catalog datafile '/u01/app/oracle ...
- 让Socket穿透Windows防火墙
原文地址:https://blog.csdn.net/zuishikonghuan/article/details/48030539 创建了ServerSocket以后,并不是没事了,其实上,为了系统 ...