分为两步:

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. 【JavaScript 从零开始】 语言核心部分----可选的分号

    Node.js很是火爆,前段待遇好的飞起.... 于是我决定.... 重头开始学习JavaScript有些比较特别的,或者之前我们注意到,再或者容易出错东西我会记录下来. 可选的分号 和其他许多编程语 ...

  2. C#关于操作符重载与转换

    随便写写 首先,假设我们有一个Person类型 其类型定义如下 class Person { public string Name { get; set; } = "Person" ...

  3. 算法:QQ等级换算成皇冠太阳星星月亮

    /// <summary> /// 等级换算成图标分布 /// 以QQ的形式计算 /// 2^(2*0) /1    /// 2^(2*1) /4    /// 2^(2*2) /16   ...

  4. JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱

    1 java三大特征 1)封装:即class,把一类实体定义成类,该类有变量和方法. 2)继承:从已有的父类中派生出子类,子类实现父类的抽象方法. 3)多态:通过父类对象可以引用不同的子类,从而实现不 ...

  5. npm saveError ENOENT: no such file or directory

    1.报错情况 在执行npm install xxx时,出现如下:npm WARN saveError ENOENT: no such file or directory, open '/nodetes ...

  6. 深入理解MyBatis的原理(一): 独立的入门demo

    前言:不结合spring,只有 mybatis+maven.数据库使用 oracle.不尝试永远不知道会发生什么事,其中遇到两个小问题,也记录下来了.转载请注明出处:https://www.cnblo ...

  7. 宝塔面板nginx配置安装Discuz

    Discuz!在Nginx下的Rewrite 需要说明的是,下网上以前一直流传的Rewrite都是有误的. 下面的Rewrite中百分号前面多了个转移字符"",这在Apache中是 ...

  8. CSS 画一个心

    效果图: 实现原理: 可以把这个心分为两部分,两个长方形,分别设置 border-radius,transform: rotate() . 设置属性之后 再次添加一个,设置相反的 rotate 设置其 ...

  9. sql 内连接 子查询 合并查询

    -- 内连接:-- 显示员工姓名.工资和公司所在地 select e.ename, e.sal, d.dname from emp e,dept d; -- 笛卡尔积 select e.ename, ...

  10. 【Java】读写文本文件

    package rw; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutput ...