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; } ...
随机推荐
- META标签的设置
㈠定义及用法 ⑴<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. ⑵<meta> 标签位于文档的头部,不 ...
- spring aop 实现controller 日志
@Aspect @Component @Slf4j public class ControllerAspact { @Pointcut("execution(public * com.exa ...
- select和FD_SET等
转自:http://blog.csdn.net/cstarbl/article/details/7645298 select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供sele ...
- unittest详解(一) unittest初识
unittest是python内置的一个单元测试框架,在学习怎么使用它之前,我们先来了解它的一些概念和原理. Test Case:测试用例,一个TestCase的实例就是一个测试用例.什么是测试用例呢 ...
- A. Be Positive
A. Be Positive time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- sqli-labs(43)
0X01和42关比起来 只是闭合变了 那么我们可以构造 ');insert into users values(98,'zhong','zhong')# 成功注入
- python学习之路(19)
匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x) ...
- sqli-libs(3)
今天我们来讲解 sqli-libs(3) 有括号的单引号报错 首先我们来查看加入'看报错了 在加‘’ 没报错 证明 存在注入 然后我们看加入’的报错回显的是什么 和我们的sqli-libs(1)的报 ...
- Android学习_7/24
一. 活动的生命周期 1. 活动状态 运行:位于返回栈栈顶 暂停:不在栈顶,但仍可见 停止:不在栈顶,完全不可见 销毁:从栈中移除 2. 活动的生存期 ...
- Vue学习日记(二)——Vue核心思想
前言 Vue.js是一个提供MVVM数据双向绑定的库,其核心思想无非就是: 数据驱动 组件系统 数据驱动 Vue.js 的核心是一个响应的数据绑定系统,它让数据与DOM保持同步非常简单.在使用 jQu ...