SpringAop代理模式
代理模式介绍:
代理的设计理念是限制对象的直接访问,即不能通过 new 的方式得到想要的对象,而是访问该对象的代理类。
这样的话,我们就保护了内部对象,如果有一天内部对象因为某个原因换了个名或者换了个方法字段等等,那对访问者来说一点不影响,因为他拿到的只是代理类而已,从而使该访问对象具有高扩展性。
代理类可以实现拦截方法,修改原方法的参数和返回值,满足了代理自身需求和目的,也就是代理的方法增强性。
按照代理的创建时期,代理可分为:静态代理和动态代理。静态代理由开发者手动创建,在程序运行前,已经存在;而动态代理不需要手动创建,它是在程序运行时动态的创建代理类。
总结:代理模式–给某个对象提供一个代理,以改变对该对象的访问方式。
静态代理
演示: 需求:是我要卖掉我的车子,但是由于我很忙,所以卖掉车子的过程中不想每天被电话骚扰,于是我就在附近找了一个二手车交易的中介,希望在他的帮助下很轻松的卖掉车子,那么就用到了代理。
1.首先创建一个接口:
package com.zzx.proxy.staticproxy;
public interface SaleCar {void SaleCar();
}
2.再创建一个接口实现类:
package com.zzx.proxy.staticproxy;
//客户类
public class SaleCarImpl implements SaleCar{@Overridepublic void SaleCar() {System.out.println("客户本人买车");}
}
3.再创建一个代理类:
package com.zzx.proxy.staticproxy;
//代理类
public class SaleProxy implements SaleCar{private SaleCar car;public SaleProxy(SaleCar car){this.car = car;}//代理开始买车@Overridepublic void SaleCar() {System.out.println("找到买车的人....找到了....谈价钱");//客户的真正操作执行的动作car.SaleCar();System.out.println("收佣金");}
}
4.最后,创建一个测试类:
package com.zzx.proxy.staticproxy;
//实现类
public class Test {public static void main(String[] args) {//车SaleCarImpl saleCar = new SaleCarImpl();//代理SaleProxy saleProxy = new SaleProxy(saleCar);//买车saleProxy.SaleCar();}
}
5.使用静态代理执行完的效果如下:
静态代理总结
总结:
虽然使用动态代理可以解决我们的问题,但是当我们有越来越多的委托类的需要我们代理时,而且代理做的工作又完全一样,会==多出很多的代理类(缺点),==这样就会增加我们的工作量,但是我们又比较懒.因此,动态代理诞生了,动态代理可以让我们只定义一次就能为很多类做代理 .
动态代理:
特点:在程序运行过程中动态的创建代理类.
动态代理分为两种:jdk动态代理,以及cglib动态代理,那么我们就简单介绍一下这两种动态代理.
JDK动态代理
在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。
实现步骤:
1. 目标接口和实现类与上面的静态代理一致
2. 通过实现InvocationHandler接口创建自己的调用处理器
3. 通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理类
4. 通过反射机制获得动态代理类的构造函数(JDk自带,不需要手动处理)
5. 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入(Jdk自带,不需手动处理)
1. 接口
package com.zzx.proxy.dynamicproxy;
//接口
public interface SaleCar {void SaleCar();
}
2. 接口实现类
package com.zzx.proxy.dynamicproxy;
//客户
public class SaleCarImpl implements SaleCar {@Overridepublic void SaleCar() {System.out.println("客户本人买车");}
}
3. 实现InvocationHandler接口
package com.zzx.proxy.dynamicproxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler {//要代理的对象private Object object;//在创建代理工厂时,传入要代理的目标对象public MyInvocationHandler(Object o){this.object = o;}/*** 代理执行的方法* 参数一: proxy 代理对象* 参数二: method 目标方法* 参数三: args 目标方法需要的参数*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//代理做的 --前置增强方法System.out.println("前");//目标类的目标方法method.invoke(object,args);//代理做的 --后置增强方法System.out.println("后");//不用管返回值return null;}
}
4. 创建测试类,来测试此动态代理
package com.zzx.proxy.dynamicproxy;import java.lang.reflect.Proxy;public class MainClass {public static void main(String[] args) {//创建目标类对象SaleCarImpl saleCar = new SaleCarImpl();Class<? extends SaleCarImpl> carClass = saleCar.getClass();//获得类加载器ClassLoader classLoader = carClass.getClassLoader();//获得全部接口Class<?>[] interfaces = carClass.getInterfaces();//创建处调用工厂MyInvocationHandler myInvocationHandler = new MyInvocationHandler(saleCar);//创建代理SaleCar car =(SaleCar) Proxy.newProxyInstance(classLoader,interfaces,myInvocationHandler);car.SaleCar();}
}
CGLIB动态代理
CGLIB动态代理特点:既可以代理接口,也可以代理类 .
ps: 今天演示的代理类 , 没有演示代理接口 .
1. 实现步骤 :
1. 通过实现CGLIB包提供的MethodInterceptor接口,重写intercept方法,创建自己的方法的拦截器.
2. 通过CGLIB中的Enhancer的creat方法创建动态代理对象.
1. 导入jar包 :
Spring的AOP是基于CGLIB实现的,所有Spring-corr.jar包以及整合了上述包,
1. 创建接口类:
package com.zzx.proxy.dynamicproxy;
//接口
public interface SaleCar {void SaleCar();
}
2. 创建接口实现类:
package com.zzx.proxy.dynamicproxy;
//客户
public class SaleCarImpl implements SaleCar {@Overridepublic void SaleCar() {System.out.println("客户本人买车");}
}
3. 创建CGLIB的代理拦截器:
package com.zzx.proxy.dynamicproxy;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** @author ZhengZiXuan* @date 2021/3/2* @desc CGLIB*/
public class MyProxyInterceptor implements MethodInterceptor {// CGLIB提供的增强工具类private Enhancer enhancer = new Enhancer();// 创建代理拦截器时,传入目标类的字节码文件public MyProxyInterceptor(Class clazz){enhancer.setSuperclass(clazz);enhancer.setCallback(this);}/*** 通过增强工具类,获得代理对象*/public Object getProxyBean() {return enhancer.create();}@Overridepublic Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("前===" );// 执行目标方法methodProxy.invokeSuper(object,args);System.out.println("后====" );return null;}
}
4. 创建测试生成代理类 :
public static void main(String[] args) {MyProxyInterceptor interceptor = new MyProxyInterceptor(SaleHouseImpl.class );SaleHouseImpl proxyBean = (SaleHouseImpl) interceptor.getProxyBean( );proxyBean.saleHouse();
}
/**
* 目标类即使没有接口,一样可以运行!
*/
代理 - 总结
代理解释: 什么是代理 ? 好处 ? 代理的方式 ?
静态代理 ;
动态代理 ;
jdk动态代理 —> 只能代理接口
Cglib动态代理 —> 既可以代理接口 , 也可以代理类
SpringAop代理模式相关推荐
- SpringAOP之代理模式
SpringAOP之代理模式 SpringAOP之代理模式 一.代理模式 二.静态代理 三.JDK动态代理 四.CGLib动态代理 五.总结 SpringAOP之代理模式 SpringAOP指的是在s ...
- 代理模式与三种方式实现SpringAOP!
1.代理模式 为什么要学习代理模式?因为这就是Spring AOP 的底层 ![SrpingAOP 和 SpringMVC]这两个面试重点! 代理模式分类: 静态代理 动态代理 1.1静态代理 角 ...
- GOF23设计模式(结构型模式)代理模式~
代理模式应用场景十分广泛,随便一个框架都会用到,因此学好代理模式对后续框架学习是最基本的要素!!今天我们就来讲讲代理模式! 目录 1.简介 1. 核心作用 2. 角色分析 2. 应用场景 4. 分类 ...
- final类是否可以被代理_设计模式——代理模式
代理模式 什么是代理模式 通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理.既(AOP微实现) ,AOP核心技术面向切面编程. 代理模式应用场景 SpringAOP ...
- 代理模式详解(包含原理详解)
http://www.cnblogs.com/zuoxiaolong/p/pattern3.html 作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为 ...
- Spring AOP 代理模式
记录几篇关于AOP & 代理模式 的博客,写的非常好,感谢作者分享! Java中的代理模式--静态代理以及分析静态代理的缺点 Java中动态代理的两种方式JDK动态代理和cglib动态代理以及 ...
- Spring自学日志05(代理模式)
为什么要学习代理模式?因为这就是SpringAOP的底层! 抽象角色:一般是接口或抽象类 真实角色:被代理的角色 代理角色:代理真实角色,代理后还会做一些附属操作 客户:访问代理角色的人 静态代理模式 ...
- 【设计模式笔记】代理模式
代理模式是SpringAOP的底层.代理模式是SpringAOP的底层. 静态代理: 角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理角色:代理真实的角色,代理真实角 ...
- 二十三种设计模式(第十二种)-----代理模式(Proxy)
二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...
最新文章
- html中#include file的使用方法
- dubbo接口访问控制
- 读书笔记_大话数据结构第九章_排序
- 修改了一下voddown.py
- hibernate5.2.10.Final基本配置
- 张俊红数据分析知识体系(持续更新中......)
- centos7 安装nginx报错./configure: error: the HTTP rewrite module requires the PCRE library
- verilog实现多周期处理器之——目录及总述
- 微信小程序开发基础知识总结
- 微信小程序云开发教程-微信小程序的API入门-API的类型和语法结构
- emblog博客打开显示 数据库密码错误,请返回主页的解决办法!
- GitHub上README写法暨markdown语法解读
- U盘恢复软件,U盘格式化后怎么恢复数据
- 14个优化网站性能提高网站访问速度技巧
- why python?
- ColdFusion mx 7.0 函数分类列表
- Ubuntu安装Microsoft office
- 计算机音乐的感想,音乐教师工作心得体会(精选7篇)
- 图灵计算机模型意义,图灵机计算模型的主要贡献是什么
- 启动注销服务器,window server 2012系统服务器桌面重启关机注销的几种方法