品牌型号:联想ThinkPad X1
系统:Windows10家庭版
软件版本:Spring 5.3.7
Spring框架发展到今天,已经成了我们Java开发绕不开的一个框架。可以这么说,接触过Spring的开发者都清楚,仅依赖DI不足以简化开发,Spring核心优势之一是统一处理日志、事务、权限等横切需求。不需要在各个业务方法重复编写冗余代码,可以在不修改原有业务逻辑的前提下附加通用功能,这背后靠的就是AOP。那么,Spring AOP到底是怎么实现的?很多教程中都会提到动态代理,那这是不是说Spring AOP本身就等同于动态代理?下面就给大家介绍一下Spring AOP是什么,Spring AOP是动态代理吗的相关内容。
一、Spring AOP是什么
有很多新手朋友在学习Spring的时候,都听到过AOP这个词,那么Spring AOP到底是什么呢?AOP也叫做“面向切面编程”。我们在做项目的时候经常要去做日志记录、权限校验还有事务控制,而且还要统计接口耗时,像这些功能跟我们的业务逻辑没有什么关联,但是如果靠我们传统写代码的方式,那几乎每个方法里都得用上。

如果按我们传统的写法,几乎是每个业务方法里都得手动加一遍这些代码,不仅写起来繁琐,维护起来也很麻烦,有时候可能只需要改一个地方,但是要翻几十个文件。

AOP的思路就是把这类散布在各个业务模块的通用横切逻辑,单独定义成一个切面,然后通过配置告诉框架“这段逻辑该在什么时候,作用在哪些方法上”。

使用AOP,原来的业务代码该怎么写就还是怎么写,我们不用去关心日志或事务这些事,框架会在背后把切面逻辑“织入”进去。这样一来,业务逻辑和这些附加功能就彻底解耦了,代码看着干净,改起来也轻松。
二、Spring AOP是动态代理吗
Spring AOP是一种编程思想,Spring AOP确实主要靠动态代理来完成切面逻辑的织入,但用的不止一种代理方式,而是两种:JDK动态代理和CGLIB代理。
如果目标类实现了某个接口,Spring默认会用JDK自带的动态代理机制。简单来说就是基于反射,在运行时生成一个实现了同样接口的代理类,所有方法调用都会先经过这个代理对象,代理对象再决定什么时候、怎么调用切面逻辑,什么时候再去调真正的目标方法。

如果目标类没有实现任何接口,JDK动态代理就用不上了,这时候Spring会换成CGLIB代理,CGLIB的原理不太一样,它是通过字节码技术,在运行时生成一个目标类的子类,然后重写父类的方法,在重写的方法里加入增强逻辑。所以用CGLIB代理的类,不能被声明为final,因为final类没法被继承。

这两种方式该用哪个,Spring会自动判断的,有接口就优先用JDK动态代理,没有接口就用CGLIB,当然,我们也可以手动配置强制使用某一种。

以上就是Spring AOP是什么,Spring AOP是动态代理吗的全部内容了。Spring AOP解决的是横切关注点与业务逻辑解耦问题,是编程思想层面的东西。动态代理只是实现这套思想的方式,JDK动态代理也好,CGLIB也好,本质上都是为AOP服务的工具,目标类实现了接口,就用JDK动态代理,没有接口就用CGLIB,是Spring自动判断,我们也可以手动强制。