AOP的核心:代理与织入
分为两步:
1、动态生成代理类;
2、织入;
2.6 织入(Weaving)
织入是将增强添加到目标的具体连接点上的过程 。
AOP 织入方式:
方式 实现 应用
编译期织入 特殊的 Java 编译器。 AspectJ
类装载期织入 特殊的类装载器。 AspectJ
动态代理织入 在运行期为目标类添加增强生成子类的方式。 Spring
2.7 代理(Proxy)
一个类被 AOP 织入增强后,就产生了一个结果类,它融合了原类和增强逻辑的代理类 。 根据不同的代理方式,代理类可能是与原类具有相同接口的类,也可能是原类的子类。
---------------------
作者:deniro_li
来源:CSDN
原文:https://blog.csdn.net/deniro_li/article/details/80512576
版权声明:本文为博主原创文章,转载请附上博文链接!
aop 代理与织入:
- 2、使用 AOP 场景
- 性能监控:在方法调用前后记录调用事件,方法执行太长或超时报警。
- 缓存代理:缓存某方法的返回值,下次执行该方法时,直接从缓存里获取。
- 软件破解:使用AOP修改软件的验证类的判断逻辑。
- 记录日志:在方法执行前后记录系统日志。
- 工作流系统:工作流系统需要将业务代码和流畅引擎代码混合在一起执行,那么可以使用 AOP 将其分离,并动态挂载业务。
- 权限验证:方法执行前验证是否有权限执行当前方法,没有则抛出没有权限执行异常,由业务代码捕获。
五、两种动态代理方式
SpringAOPCGlibSpring: JDKProxyCglibAopProxyFactoryAdvisedSupportJDKCglib1、JDK 动态代理
- JDKjava.lang.reflectProxyInvocationHandlerInvocationHandlerProxyInvocationHandler2、CGLib动态代理
- CGLib全称为Code Generation Library,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展Java类与实现Java接口,CGLib封装了asm,可以再运行期动态生成新的class。和JDK动态代理相比较:JDK创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过CGLib创建动态代理。
https://segmentfault.com/a/1190000017403541
织入
织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象。在目标对象的生命周期里有多个点可以进行织入:
- 编译器:切面在目标类编译时被织入。Aspect的织入编译器就是以这种方式织入切面的。
- 类加载器:切面在目标类加载到JVM时被织入。需要特殊的类加载(Classloader),它可以在目标类被引入之前增强该目标类的字节码(CGlib)
- 运行期:切面在应用运行时的某个时刻被织入。AOP会为目标对象创建一个代理对象
4.1.2 Spring对AOP的支持
并不是所有的AOP框架都是相同的,他们在连接点模型上可能有强弱之分。有些允许在字段修饰符级别的通知,而另一些只支持与方法调用相关的连接点。它们织入切面的方式和时机也有所不同。但是,无论如何,创建切点来定义切面所织入的连接点是AOP的基本功能。
Spring提供了4种类型的AOP支持:
- 基于代理的经典Spring AOP
- 纯POJO切面
- @AspectJ注解驱动的切面
- 注入式AspectJ切面
前三种都是Spirng AOP实现的变体,Spring AOP构建在动态代理基础上。因此,Spring对AOP的支持局限于方法拦截。
https://segmentfault.com/a/1190000013343102
织入(Weaving)
将 aspect 和其他对象连接起来, 并创建 adviced object 的过程.
根据不同的实现技术, AOP织入有三种方式:
- 编译器织入, 这要求有特殊的Java编译器.
- 类装载期织入, 这需要有特殊的类装载器.
- 动态代理织入, 在运行期为目标类添加增强(Advice)生成子类的方式.
Spring 采用动态代理织入, 而AspectJ采用编译器织入和类装载期织入.
关于 AOP Proxy
Spring AOP 默认使用标准的 JDK 动态代理(dynamic proxy)技术来实现 AOP 代理, 通过它, 我们可以为任意的接口实现代理.
如果需要为一个类实现代理, 那么可以使用 CGLIB 代理. 当一个业务逻辑对象没有实现接口时, 那么Spring AOP 就默认使用 CGLIB 来作为 AOP 代理了. 即如果我们需要为一个方法织入 advice, 但是这个方法不是一个接口所提供的方法, 则此时 Spring AOP 会使用 CGLIB 来实现动态代理. 鉴于此, Spring AOP 建议基于接口编程, 对接口进行 AOP 而不是类.
AOP的核心:代理与织入的更多相关文章
- day5 SpringSecurity权限控制jsr250注解不起作用 AOP日志排除不需要织入的方法 web.xml配置错误码页面
- Spring AOP 之编译期织入、装载期织入、运行时织入(转)
https://blog.csdn.net/wenbingoon/article/details/22888619 一 前言 AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP ...
- Spring AOP: 织入的顺序
spring AOP 采用和 AspectJ 一样的优先顺序来织入增强处理:在进入连接点时,高优先级的增强处理将先被织入:在退出连接点时,高优先级的增强处理会后被织入. 当不同的切面里的两个增强处理需 ...
- 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)
Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 1.spring中的aop演示 aop:面向方面编程.不 ...
- 30个类手写Spring核心原理之AOP代码织入(5)
本文节选自<Spring 5核心原理> 前面我们已经完成了Spring IoC.DI.MVC三大核心模块的功能,并保证了功能可用.接下来要完成Spring的另一个核心模块-AOP,这也是最 ...
- AOP静态代理解析2-代码织入
当我们完成了所有的AspectJ的准备工作后便可以进行织入分析了,首先还是从LoadTimeWeaverAwareProcessor开始. LoadTimeWeaverAwareProcessor实现 ...
- 黑马Spring学习 AOP XML和注解配置 5种通知 切点切面通知织入
业务类 package cn.itcast.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoin ...
- 【开源】.Net Aop(静态织入)框架 BSF.Aop
BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...
- Spring配置AOP实现定义切入点和织入增强
XML里的id=””记得全小写 经过AOP的配置后,可以切入日志功能.访问切入.事务管理.性能监测等功能. 首先实现这个织入增强需要的jar包,除了常用的 com.springsource.org.a ...
随机推荐
- 请整体描述Java异常体系
java把异常当做对象来处理,并定义一个基类Throwable作为所有异常的超类.在java API中已经定义了许多异常的类,这些异常分为两大类,错误Error和异常Exception.其中异常Exc ...
- 基于win32的windows画板程序
功能设计如下: 1.Graphics菜单中可选择图形,支持Rectangle, Circle, Line,选择对应图形,则相应菜单项前面加上选中标志: 2.Options菜单中包含以下选项 a.Col ...
- java设计模式-----17、中介者模式
概念: Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种.Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中, ...
- java设计模式-----10、享元模式
Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使 ...
- Extjs checkbox数值回显
昨天上午花了半天时间都在调 extjs的编辑页面里的CheckBox的回显问题,一直没搞定,毕竟我接触extjs才一个月不到,属于小白.先上个图: 这就是编辑页面的时候,需要的效果.然后我代码里是用了 ...
- html基础-html简介-第一个网页(1)
今天刚刚开通博客园,把我最近整理的html/css来说一下,对于初学者还是有一定的帮助. 一.先来为大家简单普及以下html (1).html英文即:hypertext markup language ...
- nodejs学习 之 安装
1. 官网找最新适合自己电脑的版本 下载 https://nodejs.org/en/download/ 2.我的是win7 x64选择了msi的安装包,安装过程修改安装的目标目录,最好不要放在c ...
- <Android 基础(二十九)> Fragment (2) ~ DialogFragment
简介 上一篇简单的介绍了下Fragment的使用方法,这一篇主要看下DialogFragment. 在android 3.0时被引入.是一种特殊的Fragment,用于在Activity的内容之上展示 ...
- elasticsearch 多列 聚合(sql group by)
文档数据格式 {"zone_id":"1","user_id":"100008","try_deliver_t ...
- arcengine 正确绑定办法
if (!RuntimeManager.Bind(ProductCode.Engine)) { if (!RuntimeManager.Bind(ProductCode.Desktop)) { Mes ...