20. AOP实现自定义注解记录日志(准备篇)
1、什么是AOP?
这个大家肯定都知道。AOP(Aspect Oriented Programming)
是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。可以说是OOP
(Object-Oriented Programing
,面向对象编程)的补充和完善。
2、AOP的应用场景
- 日志打印及记录
- 权限认证
- 全局异常处理拦截
- 返回值统一处理
- 多数据源切换
- 事务处理
- ... ...
总之,就是要明白Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。只要符合,那么aop就适用。
3、如何使用AOP?
原则上来说,我们只要引入 Spring 框架中 AOP 的相应依赖就可以直接使用 Spring 的 AOP 支持了,不过,为了进一步为大家使用 SpringAOP 提供便利,SpringBoot 还是“不厌其烦”地为我们提供了一个 spring-boot-starter-aop
自动配置模块。
spring-boot-starter-aop 自动配置行为由两部分内容组成:
spring-boot-autoconfigure
下的org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
提供@Configuration
配置类和相应的配置项。spring-boot-starter-aop
模块自身提供了针对spring-aop
、aspectjrt
和aspectjweaver
的依赖。
一般情况下,只要项目依赖中加入了 spring-boot-starter-aop
,其实就会自动触发 AOP 的关联行为,包括构建相应的 AutoProxyCreator
,将横切关注点织入(Weave)相应的目标对象等。
不过 AopAutoConfiguration
依然为我们提供了可怜的两个配置项,用来有限地干预 AOP 相关配置: spring.aop.auto=true ;spring.aop.proxy-target-class=false
,对我们来说,这两个配置项的最大意义在于:允许我们投反对票,比如可以选择关闭自动的 aop 配置spring.aop.auto=false
,或者启用针对 class 而不是 interface 级别的 aop 代理(aop proxy)。
4、如何实现AOP?
实现AOP的技术,主要分为两大类:
- 一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
- 二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
然而殊途同归,实现AOP的技术特性却是相同的,分别为:
- 1、
Joinpoint
(连接点):是程序执行中的一个精确执行点,例如类中的一个方法。它是一个抽象的概念,在实现AOP时,并不需要去定义一个join point。 - 2、
Pointcut
(切入点):本质上是一个捕获连接点的结构。在AOP中,可以定义一个point cut,来捕获相关方法的调用。 - 3、
Advice
(通知):是point cut的执行代码,是执行“方面”的具体逻辑。
拓展一下:advice(通知)可分为以下5种通知类型:
- 前置通知(
Before
):在目标方法被调用之前调用通知功能。- 后置通知(
After
):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。- 返回通知(
AfterReturning
):在目标方法成功执行之后调用通知。- 异常通知(
AfterThrowing
):在目标方法抛出异常后调用通知。- 环绕通知(
Around
):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
- 4、Aspect(方面):point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的关系。
- 5、Introduce(引入):为对象引入附加的方法或属性,从而达到修改对象结构的目的。有的AOP工具又将其称为mixin。
上述的技术特性组成了基本的AOP技术,大多数AOP工具均实现了这些技术。它们也可以是研究AOP技术的基本术语。
那么,我么接下来就来演示一下,如何具体在项目中进行配置。
三、配置
我们只需要在项目依赖中加入 spring-boot-starter-aop
就可以使用AOP了。
1、pom依赖
xml复制代码<!--AOP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
如上在pom中加入aop starter、等依赖从maven源仓库下载好后,我们就可以正常使用AOP了。
2、application-dev.yaml
除了引用aop依赖,我们可能还会涉及到一个配置。就像我上述所介绍的那样,允许我们手动关闭自动的aop配置,就可以直接在我们的项目配置文件中加上如下auto
与 proxy-target-class
配置项就行,一般我们是不需要配,但是我们得知道有这么个东西就行。
vbnet复制代码spring:
aop:
auto: true #自动代理开启;false:关闭
proxy-target-class: false #属性值决定是基于接口的还是基于类的代理被创建.true表示基于类的代理将使用,false表示默认使用Jdk基于接口的代理
下一期,我们将从两个案例中进行剖析,由浅入深式的带着大家怎么在具体项目中使用它,带着大家在使用的过程中体会一下aop所带来的独特魅力,它的横切就是那么的别致,敬请期待吧。