分为两步:

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的核心:代理与织入的更多相关文章

  1. day5 SpringSecurity权限控制jsr250注解不起作用 AOP日志排除不需要织入的方法 web.xml配置错误码页面

  2. Spring AOP 之编译期织入、装载期织入、运行时织入(转)

    https://blog.csdn.net/wenbingoon/article/details/22888619 一   前言 AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP ...

  3. Spring AOP: 织入的顺序

    spring AOP 采用和 AspectJ 一样的优先顺序来织入增强处理:在进入连接点时,高优先级的增强处理将先被织入:在退出连接点时,高优先级的增强处理会后被织入. 当不同的切面里的两个增强处理需 ...

  4. 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)

    Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 1.spring中的aop演示 aop:面向方面编程.不 ...

  5. 30个类手写Spring核心原理之AOP代码织入(5)

    本文节选自<Spring 5核心原理> 前面我们已经完成了Spring IoC.DI.MVC三大核心模块的功能,并保证了功能可用.接下来要完成Spring的另一个核心模块-AOP,这也是最 ...

  6. AOP静态代理解析2-代码织入

    当我们完成了所有的AspectJ的准备工作后便可以进行织入分析了,首先还是从LoadTimeWeaverAwareProcessor开始. LoadTimeWeaverAwareProcessor实现 ...

  7. 黑马Spring学习 AOP XML和注解配置 5种通知 切点切面通知织入

    业务类 package cn.itcast.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoin ...

  8. 【开源】.Net Aop(静态织入)框架 BSF.Aop

    BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...

  9. Spring配置AOP实现定义切入点和织入增强

    XML里的id=””记得全小写 经过AOP的配置后,可以切入日志功能.访问切入.事务管理.性能监测等功能. 首先实现这个织入增强需要的jar包,除了常用的 com.springsource.org.a ...

随机推荐

  1. MSSQL存储过程实现拼接sql的注意点

    这里我昨天碰到的问题就是执行一段根据变量tableName对不同的表进行字段状态的更改.由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面. 这里就出现了一个问题,我花费 ...

  2. ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock 问题修改

    ubuntu 常见错误–Could not get lock /var/lib/dpkg/lock 通过终端安装程序sudo apt-get install xxx或者apt-get update时出 ...

  3. 前端(九):react生命周期

    一.组件渲染 当组件的props或者state发生改变时,组件会自动调用render方法重新渲染.当父组件被重新渲染时,子组件也会被递归渲染.那么组件是如何渲染的呢? # 方案一 1.state数据 ...

  4. PHP中常用的魔术方法

    我们在PHP中经常用到魔术方法,像构造方法,析构方法等等魔术变量,下面总结一下一些常用的魔术变量: __construct(),__destruct(),__clone(),__autoload(), ...

  5. 代码实现自定义TableView

    实现效果(通过代码的方式实现TableCell 的创建) 实现过程: 实现过程两个部分 1 数据源的准备 本例子采用NSDictionary +NSArray 为数据源 (接口部分) (数据初始化部分 ...

  6. Codeforces 981H:K Paths

    传送门 考虑枚举一条路径 \(u,v\),求出所有边经过它的答案 只需要求出 \(u\) 的子树内选出 \(k\) 个可以重复的点,使得它们到 \(u\) 的路径不相交 不难发现,就是从 \(u\) ...

  7. 如何调试flutter应用

    The Dart Analyzer 这个工具帮助你分析代码,发现可能的错误. 运行命令行 终端进入flutter工程所在目录,执行flutter analyze 使用IntelliJ IDEA Dar ...

  8. 如何从 GitHub 上下载单个文件夹

    DownGit 好用记得回来点赞(建议***)

  9. 风险管理,未雨绸缪——《代码之殇》读书笔记II

    这次的内容主要是关于软件开发过程中的风险管理,包括项目用时估计.产品的发布与更新.承诺兑现的重要性. ①项目用时估计 有人会质疑项目用时估计的可靠性,因为就事而言,这次的任务可能和上次不一样了,开发环 ...

  10. leetcode题解之分解字符串域名

    1.题目描述 A website domain like "discuss.leetcode.com" consists of various subdomains. At the ...