摘要:扩展了语言,定义了语法,所以它有一个专门的编译器用来生成遵守字节码规范的文件注意此,非。只是提供了和语法一致的语义注解,两者是完全不同的实现。修改类运行时,在内通过转换类的字节码,把横切逻辑织入到目标类中。
AOP概述
AOP(Aspect-Oriented Programming,面向切面的编程)是一种编程范式,专注于解耦业务逻辑和横切逻辑,从而达到提升内聚和模块化的目的。
业务逻辑 :处理业务的逻辑。
横切逻辑 :通常固定的出现在业务逻辑的边界处,在进入业务逻辑前或执行业务逻辑后做一些事情。
看一个例子:
横切逻辑
public class PerformanceMonitor { public void start() { System.out.println("开始时间: " + String.valueOf(System.currentTimeMillis())); } public void end() { System.out.println("结束时间: " + String.valueOf(System.currentTimeMillis())); } }
业务逻辑
public class Biz { private PerformanceMonitor pMonitor = new PerformanceMonitor(); public void doSomething() { pMonitor.start(); System.out.println("做一些业务逻辑"); pMonitor.end(); } public static void main(String [] args) { Biz biz = new Biz(); biz.doSomething(); } }
上面例子中,我们希望通过PerformanceMonitor打印业务执行开始和结束时间,乍眼一看似乎没毛病。
那问题来了,如果我希望:
在调试阶段才打印开始和结束时间,应用发布后不打印。
希望在其他业务逻辑开始和结束的时候也打印时间。
按照现在的处理方式,业务逻辑和横切逻辑耦合在了一起,需要满足上述需求的话,需要修改代码后再重新编译,显然这种处理方式不够优美。
AOP就是一种优美的处理方式,如下:
Java AOP的实现方式Java中实现AOP的方式分 静态AOP 和 动态AOP 两大类,下面分别列举。
静态AOP在编译期间,横切逻辑直接以字节码形式编译到业务逻辑的字节码文件中,通常需要特殊的编译器。
Aspectj扩展了java语言,定义了AOP语法,所以它有一个专门的编译器(ajc)用来生成遵守Java字节码规范的Class文件
注意 : 此Aspectj,非Spring Aspectj。Spring Aspectj只是提供了和Aspectj AOP语法一致的语义注解,两者是完全不同的实现。
动态AOP在运行期间,通过修改目标类的字节码、生成类的子类或代理类织入横切逻辑。
运行时,通过为目标类实现的接口动态生成代理类,把横切逻辑织入到代理类中。
运行时,通过为目标类生成子类,把横切逻辑织入到子类中。
运行时,在类加载器加载类的时候,修改目标类的字节码,把横切逻辑织入到目标类中。
AOP方式比较运行时,在Java Agent内通过Instrumentation转换类的字节码,把横切逻辑织入到目标类中。
AOP方式 | 效率 | 实现接口 | final method | 其他特点 | |
---|---|---|---|---|---|
Aspectj | 编译效率低,运行效率高 | 不需要 | 支持 | - | |
JDK动态代理 | 生成代理效率高,执行效率低 | 需要 | N/A | 通过反射方式调业务逻辑 | |
生成子类 | 生成子类效率低,执行效率高 | 不需要 | 不支持 | - | |
自定义 ClassLoader | 加载效率低,执行效率高 | 不需要 | 支持 | 只能对自动义类加载器加载的类织入 | |
ClassFileTransformer | 加载效率低,执行效率高 | 不需要 | 支持 | 对所有类织入 |
PS :未完待续,后续章节针对每一种AOP方式举例,实现PerformanceMonitor横切逻辑的织入。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67436.html
摘要:是一种特殊的增强切面切面由切点和增强通知组成,它既包括了横切逻辑的定义也包括了连接点的定义。实际上,一个的实现被拆分到多个类中在中声明切面我们知道注解很方便,但是,要想使用注解的方式使用就必须要有源码因为我们要 前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知...
摘要:,,面向切面编程。,切点,切面匹配连接点的点,一般与切点表达式相关,就是切面如何切点。例子中,注解就是切点表达式,匹配对应的连接点,通知,指在切面的某个特定的连接点上执行的动作。,织入,将作用在的过程。因为源码都是英文写的。 之前《零基础带你看Spring源码——IOC控制反转》详细讲了Spring容器的初始化和加载的原理,后面《你真的完全了解Java动态代理吗?看这篇就够了》介绍了下...
摘要:构造函数注入通过调用类的构造函数,将接口实现类通过构造函数变量传入。而在中,其使用横切技术,将这类代码从原属的封装对象中提取出来,封装到一个可重用模块中,称为。 最近实习用到Spring的开发框架,但是之前没有接触过,因此希望利用网上的资源来学习以下。 Spring官方给出了非常全面的介绍,非常适合我这种完全的小白……在这一系列学习中,我阅读的主要资源是5.1.2 Reference ...
摘要:本文首发于作者最近在学,研究了下和代理模式,写点心得和大家分享下。所以下面来重点分析下代理模式。这里代理模式分为静态代理和动态代理两种,我们分别来看下。代理模式,代理,意味着有一方代替另一方完成一件事。 本文首发于 https://jaychen.cc作者 jaychen 最近在学 Spring,研究了下 AOP 和代理模式,写点心得和大家分享下。 AOP 先说下AOP,AOP 全称 ...
阅读 980·2021-10-27 14:15
阅读 2735·2021-10-25 09:45
阅读 1893·2021-09-02 09:45
阅读 3332·2019-08-30 15:55
阅读 1753·2019-08-29 16:05
阅读 3167·2019-08-28 18:13
阅读 3092·2019-08-26 13:58
阅读 415·2019-08-26 12:01