spring-AOP原理解析

AOP面向切面编程可以说是OOP的补充和完善。OOP引入封装,继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要把分散的对象引入公共行为的时候,OOP则显得有些无力。也就是说,OOP允许你定义从上到下的关系,但并不适合从左到右的关系。比如说日志,安全性,异常处理。这些散步在各处的无关代码被称为横切代码,在OOP涉及中,导致大量代码的重复,不利于各个模块的重用。

AOP是一种横切技术,剖解开封装对象的内部,并将哪些影响了多个类的公共行为封装到一个可重用模块,即为切面。将那些与业务无关的,却被业务模块共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并且有利于后期的可操作性和维护性。AOP代表的是一个横向的关系。使用横切技术,AOP把软件系统分为俩个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不到的部分是横切关注点。

实现AOP的技术,1采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;2是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面的代码”

AOP相关概念

PointCut:切入点,表示在哪个地方进行切入,可以指定某一个点,也可以指定多个点。

Advice:在切入点干什么,指定在切入点做什么事情(增强),打日志,缓存,处理异常

Aspect:切入点和增强形成了切面。但这里还不是完整的,因为还不知道如何将其织入到业务代码中。解决此问题的核心技术就是PROXY

PROXY:代理,它管理了AOP如何融入OOP

实现:

        1、静态代理

         静态代理产生于代码编译阶段,即一旦代码运行就不可以更改啦。

         

        通过代理类我们实现了将日志代码集成到目标类,但有很大的局限性。需要固定的类编写接口,需要实现接口的每一个函数,同样会造成代码的大量重复,将会使代码更加混乱。

        2、动态代理

        是否可以通过实现一次代码即可将增强织入到所有函数之后,需要运用到java的反射机制

        

        它的好处理时可以为我们生成任何一个接口的代理类,并将需要增强的方法织入到任意的目标函数。但它仍然具有一个局限性,就是只有实现了接口的类,才能为其实现代理。

        cglib代理模式,它通过生成目标类子类的方式来实现代理,而不是接口,规避了接口的局限性。cglib是一个很强大的高性能代码生成包,其在运行时期生成被代理对象的子类,并重写了被代理对象的所有方法,从而作为代理对象。

        

       当然cglib也具有一定的局限性,对于无法生成子类的类(final修饰的类),是无法生成代理子类的

总结:

       JDK动态代理,就是创建接口实现类的代理对象,和接口实现类平级,实现和接口实现类相同的功能

       cglib动态代理就是创建类的子类的代理对象,在子类里调用父类的方法完成增强

      

猜你喜欢

转载自blog.csdn.net/weixin_42558742/article/details/88555020