SpringAOP静态代理和动态代理
代理模式应用于SpringAOP。
SpringAOP。即面向切面的编程范式。多用于权限控制,异常处理,日志管理等场景。主要作用是分离功能性需求和非功能性需求,减少代码冗余。我们在使用的时候可以集中处理某一个关注点或者横切逻辑;可以很方便地添加/删除关注点,减少对业务代码的侵入,增强代码的可读性和可维护性。
SpringAOP是基于代理模式设计的,代理模式又分为静态代理和动态代理。静态代理是设计模式中的传统的代理模式。传统的静态代理会产生很多代码冗余。目标类和代理类共同实现接口的方法。当我们一个类有很多方法要委托给代理进行执行的时候,或者当我们的目标类有新增了接口的实现方法时,就要不断的修改代理类。这是不合理的,甚至当这些方法的代理逻辑都相同的时候,就会重复很多代码。为了解决这个问题基于反射机机制的动态代理模式就出现了。
动态代理模式分为两种:
1)基于接口的JDK动态代理。
实现InvocationHandler的invoke方法。
客户端使用Java.lang.reflect.Proxy动态代理类产生动态代理类的对象。
newProxyInstance实现过程:获得字节码(getProxyClass0/ClassFactoryProxy/proxygenerator)---创建对象(newInstance)
注意,接口类的Class是一个数组,也就是支持不同的接口的方法。也就是说,代理类在之后就无需修改。
2)基于继承的CGlib的动态代理
如果目标类没有实现接口,那就要选择使用CGLIB来动态代理目标类,有接口也行。
编写织入逻辑方法,要实现MethodInterceptor,重写intercept方法
这里说的继承是让动态产生的代理继承目标类。
setSupperClass() 将代理类继承目标类;
setCallback() 织入代理逻辑方法(实现MethodInterceptor方法)
create() 创建动态代理类
CGLIB会让生成的代理类继承当前对象,
并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。
在CGLIB底层 底层实现是通过ASM字节码处理框架来转换字节码并生成新的代理类
注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
JDK代理和CGlib代理得区别:
JDK基于反射机制,适用于目标类实现接口方法的场景,
CGlib基于继承的形式,获得目标类的所有内容。如果目标类为final、static,则无法继承;如果方法为final、private则也无法使用CGlib.
SpringAOP静态代理和动态代理相关推荐
- Spring系列之静态代理、动态代理、cglib代理与Spring AOP的处理
本章内容 代理的概念及理解 如何实现静态代理 如何实现动态代理 静态代理与动态代理有什么区别与优缺点 JDK动态代理如何实现 cglib动态代理如何实现 JDK动态代理与cglib动态代理的区别 Sp ...
- Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理
文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...
- Spring AOP中的静态代理和动态代理的原理和实践
对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...
- 静态代理、动态代理概念及使用
文章目录 1. 为什么要用静态代理 2. 静态代理的实现 3. 静态代理的缺点 4. 动态代理 4.1 JDK动态代理 4.1.1 InvocationHandler 4.1.2 Class 4.1. ...
- java静态代理与动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式.其目的是为其他对象提供一个代理以控制对某个真实对象的访问.通过代理类这一中间层,有效控制对真 ...
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...
- Java、Android静态代理与动态代理
代理 (1) 什么是代理? 大道理上讲代理是一种软件设计模式,目的地希望能做到代码重用.具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法.这个就好比 商户----&g ...
- Java设计模式学习06——静态代理与动态代理(转)
原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...
- 架构设计之设计模式 (二) 静态代理和动态代理--间接“美”
生活中有很多例子是间接来控制和访问的,比如你找一个人不自己亲自去,而是让别人代替去做这就是最简单的代理模式,是一种间接通信的例子,对象间的间接通信也同样是面向对象设计中的一条重要的"审美观& ...
最新文章
- cd、mkdir、rmdir、touch、rm命令,绝对路径与相对路径
- spring源码分析之spring-jdbc模块详解
- android点击隐藏控件,Android编程实现点击EditText之外的控件隐藏软键盘功能
- Win10解决无法访问其他机器共享的问题
- 看门狗寄存器c语言代码_「正点原子NANO STM32F103开发板资料连载」第十一章 看门狗实验...
- AutoML 在表数据中的研究与应用
- BZOJ1734: [Usaco2005 Feb]Aggressive cows 愤怒的牛
- 解决Entry fileTemplates//Singleton.java.ft not found in C:/Dev/android-studio/lib/resources_en.jar
- 命令行shell 用于SQLite
- Unity实现IOS原生分享
- 《Python神经网络编程》
- 使用webstorm操作git
- SQL SERVER 读取 XML 数据
- UI常见面试题-整体素养篇
- 投资 2 -- 新股民必须树立正确的价值观
- 过万 star 高星项目的秘密——GitHub 热点速览 Vol.39
- vim:修改vim录制的宏
- git reset, git status, git clean, .gitignore, git diff, git restore 的关系梳理
- Azure Information Protection信息保护(AIP)/Azure Rights Management权限管理(RMS)
- 计算机网络自顶向下--网络层
热门文章
- vCenter的安装与部署
- 微信公众平台开发(24) 自定义菜单功能开发
- net类库中发送电子邮件的方法总结
- 快速傅里叶变换Matlab示例
- C++ 模板详解(二)
- 论文笔记:Git Loss
- 【机器学习入门笔记9:TensorFlow四则运算】20190216
- 调用Cython时报错: More than one filename match found for utility code Capsule
- string 中的offset_Kafka+Spark Streaming管理offset的两种方法
- TextView显示不同颜色的文本,及文本变色可点击工具类