有天上飞的概念, 就要有落地的实现
概念 + 代码实现是本文的特点, 教程将涵盖完整的图文教程, 代码案例
文章结尾配套自测面试题, 学完技术自我测试更扎实
概念十遍不如代码一遍, 朋友, 希望你把文中所有的代码案例都敲一遍
大哥大姐新年好, 点赞转发不要少
SpringBoot 图文系列教程技术大纲
鹿老师的 Java 笔记
SpringBoot 图文教程系列文章目录
SpringBoot 图文教程 1「概念 + 案例 思维导图」「基础篇上」 https://mp.weixin.qq.com/s/phk6j3ChBP-kPtS2xZeEZg
SpringBoot 图文教程 2 - 日志的使用「logback」「log4j」 https://mp.weixin.qq.com/s/7Mw_xhFF4Q5NtdtcsHc67Q
SpringBoot 图文教程 3-「'初恋'情结」集成 Jsp https://mp.weixin.qq.com/s/BYzVg5NBcF_ou_PyX8ygag
SpringBoot 图文教程 4-SpringBoot 实现文件上传下载 https://mp.weixin.qq.com/s/6ctykPo3eDBEB7YsC0PAZw
前言
在 Spring 中, 不管是学习还是面试, 有两个点是永远绕不过去的, 一个是 IoC, 另一个就是 Aop,Spring 中使用 Aop 是非常简单的, 可以通过 xml 和注解两种方式写出 aop 的代码, 那么在 SpringBoot 中有什么变化吗?
在 SpringBoot 中使用 aop 实际上没有太多的变化, 关于 SpringBoot 实际上就是对 Spring 和 SpringMVC 的进一步封装, 因此在 SpringBoot 中同样支持 Spring 框架中 AOP 切面编程, 不过在 SpringBoot 中为了快速开发仅仅提供了注解方式的切面编程.
SpringBoot 注解式 aop 的使用
本文所有的内容, 将会在下面的 demo 上进行操作. 请去 Git 仓库下载: https://gitee.com/bingqilinpeishenme/Lu-JavaNodes
1. 引入依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-aop</artifactId>
- </dependency>
2.aop 相关注解讲解
- /**
- @Aspect 用来类上, 代表这个类是一个切面
- @Before 用在方法上代表这个方法是一个前置通知方法
- @After 用在方法上代表这个方法是一个后置通知方法
- @Around 用在方法上代表这个方法是一个环绕的方法
- @Around 用在方法上代表这个方法是一个环绕的方法
- @order(数字) 用在类上, 数字越小进入越早
- **/
- /**
- 环绕, 前置, 后置全部存在
- 先进入环绕, 在进入前置, 离开前置, 离开环绕, 进入后置, 离开后置
- **/
前置切面
- /**
- * @Aspect 用来类上, 代表这个类是一个切面
- * @Component 用来告诉 SpringBoot 给当前类创建对象 等价于 @Service
- */
- @Aspect
- @Component
- public class MyAspect {
- //@Before 用在方法上代表这个方法是一个前置通知方法 注解的参数是切点表达式
- @Before("execution(* com.lu.service.*.*(..))")
- public void before(JoinPoint joinPoint){
- System.out.println("前置通知");
- //JoinPoint 通过该对象可以获取到被切入的对象的信息
- joinPoint.getTarget();// 目标对象
- joinPoint.getSignature();// 方法签名
- joinPoint.getArgs();// 方法参数
- }
- }
后置切面
- @Aspect
- @Component
- public class MyAspect {
- @After("execution(* com.lu.service.*.*(..))")
- public void before(JoinPoint joinPoint){
- System.out.println("后置通知");
- joinPoint.getTarget();// 目标对象
- joinPoint.getSignature();// 方法签名
- joinPoint.getArgs();// 方法参数
- }
- }
注意: 前置通知和后置通知都没有返回值, 方法参数都为 joinpoint
环绕切面
- @Aspect
- @Component
- public class MyAspect {
- @Around("execution(* com.lu.service.*.*(..))")
- public Object before(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
- System.out.println("进入环绕通知");
- proceedingJoinPoint.getTarget();// 目标对象
- proceedingJoinPoint.getSignature();// 方法签名
- proceedingJoinPoint.getArgs();// 方法参数
- Object proceed = proceedingJoinPoint.proceed();// 放行执行目标方法 这一步必须存在
- System.out.println("目标方法执行之后回到环绕通知");
- return proceed;// 返回目标方法返回值
- }
- }
注意: 环绕通知存在返回值, 参数为 ProceedingJoinPoint
如果不执行放行, 不会执行目标方法
一旦放行必须将目标方法的返回值返回, 否则调用者无法接受返回数据
总结
以上就是 SpringBoot 中 aop 的简单使用, 今天实际上只是简单的测试了 aop 的 API, 关于 aop 的应用, 例如: 通过 Aop 记录日志信息, 通过 Aop 操作 Redis 缓存等实战应用, 会在后续文章中写出.
恭喜你完成了本章的学习, 为你鼓掌! 如果本文对你有帮助, 请帮忙点赞, 评论, 转发, 这对作者很重要, 谢谢.
让我们再次回顾本文的学习目标
掌握 SpringBoot 中 aop 的使用
要掌握 SpringBoot 更多的用法, 请持续关注本系列教程.
下面体贴的我给朋友萌还准备了一些 自测面试题和项目案例, 希望你能够成热打铁, 将知识夯扎实.
上期自测面试题答案
见面试题集锦 https://gitee.com/bingqilinpeishenme/Lu-JavaNodes
自测面试题 (答案见下期)
注解式 Aop 的常用注解有哪些
上期自测实现项目小案例答案
见码云仓库 https://gitee.com/bingqilinpeishenme/Lu-JavaNodes
自测实现项目小案例 (答案见下期)
本次需求:
练习文中 demo
求关注, 求点赞, 求转发
来源: https://www.cnblogs.com/bingyang-py/p/12354037.html