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

java动态代理(JDK和cglib)

CGLIB 详解

https://blog.csdn.net/xlgen157387/article/details/82497594

https://blog.csdn.net/xiaohai0504/article/details/6832990

原文地址:https://www.cnblogs.com/cnki/p/15461883.html