Springboot系列(十五):基于AOP实现自定义注解且记录接口日志(准备篇)

1,124 阅读8分钟

👨‍🎓作者:bug菌
✏️博客:CSDN掘金infoQ51CTO
🎉简介:CSDN博客专家,C站历届博客之星Top50,掘金/InfoQ/51CTO等社区优质创作者,全网合计8w粉+,对一切技术感兴趣,重心偏Java方向;硬核公众号「 猿圈奇妙屋」,欢迎小伙伴们的加入,一起秃头,一起变强。
..
✍️温馨提醒:本文字数:1999字, 阅读完需:约 5 分钟

       嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

一、前言🔥

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

       在Spring体系中,实现自定义注解的方式有很多,比如呢可以写一个公共方法,然后在每个Controller中手动传参调用。

而我今天则要在这里隆重介绍一下,如何通过AOP切面思想方式来实现用户自定义的注解?大家想不想听听看,感不感兴趣呢?

       其实啊,感不感兴趣都没关系啦,我写了,自然会有愿意看的人看,毕竟我对自己写的东西,还是比较有自信滴。我会做到句句是重点,关键我是要教那些没用过spring aop实现自定义注解的人群,帮助他们,就等于在帮助我自己,我为人人,人人为我!至于大佬级别的,也随时欢迎你们对文章进行批评指正啦。

       好啦,咱们就开始今天的内容吧。

二、正文

1、什么是AOP?

       这个大家肯定都知道。AOP(Aspect Oriented Programming)是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。可以说是OOPObject-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-aopaspectjrtaspectjweaver 的依赖。 

       一般情况下,只要项目依赖中加入了 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种通知类型:

  1. 前置通知(Before):在目标方法被调用之前调用通知功能。
  2. 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
  3. 返回通知(AfterReturning):在目标方法成功执行之后调用通知。
  4. 异常通知(AfterThrowing):在目标方法抛出异常后调用通知。
  5. 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
  • 4、Aspect(方面):point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的关系。
  • 5、Introduce(引入):为对象引入附加的方法或属性,从而达到修改对象结构的目的。有的AOP工具又将其称为mixin。

       上述的技术特性组成了基本的AOP技术,大多数AOP工具均实现了这些技术。它们也可以是研究AOP技术的基本术语。

... ...

       那么,我么接下来就来演示一下,如何具体在项目中进行配置。

三、配置

       我们只需要在项目依赖中加入 spring-boot-starter-aop 就可以使用AOP了。

1、pom依赖

<!--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 配置项就行,一般我们是不需要配,但是我们得知道有这么个东西就行。

spring:
  aop:
    auto: true #自动代理开启;false:关闭
    proxy-target-class: false #属性值决定是基于接口的还是基于类的代理被创建.true表示基于类的代理将使用,false表示默认使用Jdk基于接口的代理

       下一期,我们将从两个案例中进行剖析,由浅入深式的带着大家怎么在具体项目中使用它,带着大家在使用的过程中体会一下aop所带来的独特魅力,它的横切就是那么的别致,敬请期待吧。

... ...

       OK,以上就是这期所有的内容啦,如果有任何问题欢迎评论区批评指正,咱们下期见。

四、往期热门推荐

文末🔥

如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《springboot零基础入门教学》,从无到有,从零到一!希望能帮助到更多小伙伴们。

我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

感谢认真读完我博客的铁子萌,在这里呢送给大家一句话,不管你是在职还是在读,绝对终身受用。
时刻警醒自己:
抱怨没有用,一切靠自己;
想要过更好的生活,那就要逼着自己变的更强,生活加油!!!