spring框架学习(14)AOP(中)
序言
IOC解决了类与类之间的紧耦合
AOP动态代理解决了方法之间的紧耦合
面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足。
首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式。
JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
什么是CGLIB
CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib
为什么使用CGLIB
CGLIB代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问。我们知道Java中有一个动态代理也是做这个事情的,那我们为什么不直接使用Java动态代理,而要使用CGLIB呢?答案是CGLIB相比于JDK动态代理更加强大,JDK动态代理虽然简单易用,但是其有一个致命缺陷是,只能对接口进行代理。如果要代理的类为一个普通类、没有接口,那么Java动态代理就没法使用了。关于Java动态代理,可以参者这里Java动态代理分析
CGLib 的底层是Java字节码操作框架 —— ASM。
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.12</version> </dependency>
AOP的代理可分为静态代理:编译时增强,使用AOP框架提供的命令进行编译,从而在编译阶段生成AOP代理类。
动态代理:运行时增强,借助JDK动态代理、CGLIB在内存中临时生成AOP动态代理类。
小结
AOP广泛应用于处理一些具有横切性质的系统级服务,AOP的出现是对OOP的补充,它使得开发者能用更优雅的方式处理具有横切性质的服务。
资料
https://www.cnblogs.com/liuling/archive/2013/05/21/CGlib-AOP.html
https://www.cnblogs.com/sandaman2019/p/12636727.html
https://www.cnblogs.com/xrq730/p/6661692.html
https://blog.csdn.net/xlgen157387/article/details/82497594
https://blog.csdn.net/xiaohai0504/article/details/6832990