什么是AOP
1.aop是什么
那AOP通俗点来讲是啥呢?
举个例⼦:
现在假设系统中有 3 段完全相似的代码,这些代码通常会采⽤“复制”、“粘贴”⽅式来完成,通过这种“复制”、“粘贴”⽅式开发出来的软件。可能有的读者已经发现了这种做法的不⾜之处:如果有⼀天,这部分相似的代码段需要修改,那是不是要打开 3 个地⽅的代码进⾏修改?如果不是 3 个地⽅包含这段代码,⽽是 100 个地⽅,甚⾄是 1000 个地⽅包含这段代码段,那会是什么后果?
针对该情况我们会做优化:抽出这部分代码,封装在⼀个公共类的⽅法⾥,提供其他地⽅调⽤。
当这块功能需要调整时,只要修改⼀个地⽅即可,不管整个系统中有多少地⽅调⽤了该⽅法,程序⽆须修改这些地⽅,只需修改被调⽤的⽅法即可——通过这种⽅式,⼤⼤降低了软件后期维护的复杂度。
读到这⾥你会发现,我们还没讲到下⾯我们再升级下场景:
如果 3 个地⽅需要同样新调⼀个⽅法,我们的做法会是在这三个地⽅各⾃额外补充新⽅法的调⽤。
如果不是 3 个地⽅新调⽤,⽽是 100 个地⽅,甚⾄是 1000 个地⽅来新调⽤,这样做的⼯作量也不⼩啊!
我们希望有⼀种特殊的⽅法:我们只要定义该⽅法,⽆须在⽅法 1、⽅法 2、⽅法 3 中显式调⽤它,系统会“⾃动”执⾏该特殊⽅法。
上⾯想法听起来很神奇,甚⾄有⼀些不切实际,但其实是完全可以实现的,实现这个需求的技术就是 AOP。
AOP 专门⽤于处理系统中分布于各个模块(不同⽅法)中的交叉关注点的问题。
在 Java EE 应⽤中,常常通过 AOP 来处理⼀些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP 已经成为⼀种⾮常常⽤的解决⽅案。
咳咳,AOP概念正式版:
AOP(Aspect Orient Programming),作为⾯向对象编程的⼀种补充,⼴泛应⽤于处理⼀些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。
AOP 实现的关键就在于 AOP 框架⾃动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两⼤
类,其中静态代理是指使⽤ AOP 框架提供的命令进⾏编译,从⽽在编译阶段就可⽣成 AOP 代理类,因此也称为编译时增强;
⽽动态代理则在运⾏时借助于 JDK 动态代理、CGLIB 等在内存中“临时”⽣成 AOP 动态代理类,因此也被称为运⾏时增强。
2.有什么作⽤
通过AOP,可以在指定位置执⾏对应流程。这样就可以将⼀些横向的功能抽离出来形成⼀个独⽴的模块,然后在指定位置插⼊这些功能。
spring aop应用场景3.怎么⽤
下⾯我们整理下普通的Java代码中怎么实现AOP:
有两种⽅式实现AOP切⾯,⼀种是原⽣SDK实现,⼀种是基于三⽅包cglib。
(Java的有3种代理模式:静态代理、动态代理、cglib代理。)
代理·⽐较
那么这两种⽅式有什么相同点和区别呢?
相同点是都使⽤了代理模式。
不同点是前者使⽤了接⼝代理,后者使⽤了继承代理。
JDK代理类是接⼝代理,是因为它继承了proxy这个类,java是单继承的,jdk代理类通过调⽤处理器中的invoke⽅法来实现动态代理的⽬的。cglib是⼦类代理,cglib性能要⽐jdk好,但创建代理对象时,jdk⽐cglib效率⾼。
JDK的动态代理有⼀个限制,就是使⽤动态代理的对象必须实现⼀个或多个接⼝,如果想代理没有实现接⼝的类,就可以使⽤Cglib实现。Cglib是⼀个强⼤的⾼性能的代码⽣成包,它可以在运⾏期扩展java类与实现java接⼝。它⼴泛的被许多AOP的框架使⽤它⼴泛的被许多AOP 的框架使⽤,例如Spring AOP和synaop,为他们提供⽅法的interception(拦截)。
Cglib包的底层是通过使⽤⼀个⼩⽽块的字节码处理框架ASM来转换字节码并⽣成新的类。不⿎励直接使⽤ASM,因为它要求你必须对JVM 内部结构包括class⽂件的格式和指令集都很熟悉。
总结
1、AOP 是⽤来处理⼀些具有横切性质的系统级服务。
2、java代理有三种:静态代理、动态代理、cglib代理。其中AOP涉及到的是后两者。
3、JDK代理是接⼝代理,cglib是继承代理(Spring aop就是⽤该框架)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论