spring项目中切面及AOP的使用方法


Posted in Java/Android onJune 26, 2021

使用AOP的原因(AOP简介)

我们知道,spring两大核心,IOC(控制反转)和AOP(切面),那为什么要使用AOP,AOP是什么呢,严格来说,AOP是一种编程规范,是一种编程思想,并非spring创造,AOP可以帮助我们在一定程度上从冗余的通用的业务逻辑中解脱出来,最明显的,比如每个接口的请求,都要记录日志,那这个操作如果每个地方都写,就会很繁琐,当然,记录日志并不是唯一的用法

spring的AOP只能基于IOC来管理,它只能作用于spring容器的bean

并且,spring的AOP为的是解决企业开发中出现最普遍的方法织入,并不是为了像AspectJ那样,成为一个完全的AOP使用解决方案

AOP的使用

开启AOP支持

要使用AOP,首先要开启AOP的支持

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

启动类添加 @EnableAspectJAutoProxy 注解

编写切面类与测试方法

@Aspect
@Component
public class MyAop {
 
}
@RestController
public class OneController {
 
    @GetMapping("/doCheck")
    public String doCheck (int age) {
        System.out.println("doCheck");
        if (age > 1) {
        throw new MyException(ExceptionEnu.SUCCESS);
        } else {
            throw new MyException(ExceptionEnu.FAILD);
        }
    }
 
}

记得切面类交给spring管理哦~ @Component

编写切面方法

@Before

这个注解的用法呢,就是说,在执行你要执行的东西之前,执行加了这个注解的方法

比如

@Before(value = "execution (* own.study.web.OneController.*(..))")
    public void doAop( ) {
        System.out.println("before aop");
    }

也就是说,如果我要调用 OneController 的方法,在调用到之前,会执行这个 doAop 方法

让我们来测试一下

spring项目中切面及AOP的使用方法

@After

这个注解的用法,就是说,当你执行完你的方法之后,真的返回给调用方之前,执行加了这个注解的方法

比如

@After(value = "execution (* own.study.web.OneController.*(..))")
    public void doAfter() {
        System.out.println("after aop");
    }

让我们来测试一下

spring项目中切面及AOP的使用方法

@AfterThrowing

见名知意,在发生异常后,执行加了此注解的方法

注意我上面写的测试方法了吗?我抛出了自定义的异常

让我们测试一下

spring项目中切面及AOP的使用方法

@AfterReturning

这个注解的用法也是看名字就能猜到,执行完后,执行此方法

但是!这个执行完,指的是正常执行完,不抛出异常的那种,不信?我们来试试

spring项目中切面及AOP的使用方法

@Around

这个是最为强大的一个注解,环绕通知,方法执行前和执行后都会执行加了这个注解的方法

@Around(value = "execution (* own.study.web.OneController.*(..))")
    public Object doAround (ProceedingJoinPoint point) throws Throwable {
        Gson gson = new Gson();
        System.out.println("进入AOP --->" + System.currentTimeMillis());
        System.out.println("方法名 = " + point.getSignature().toShortString());
 
        Object result = point.proceed();
 
        System.out.println("响应参数为 = " + gson.toJson(result));
        System.out.println("AOP完事了 --->" + System.currentTimeMillis());
        return result;
    }
@RestController
public class OneController {
 
    @GetMapping("/doCheck")
    public Object doCheck (int age) throws InterruptedException {
        System.out.println("这个是controller的方法 --->" + System.currentTimeMillis());
        Thread.sleep(2000l);
        System.out.println("doCheck");
 
       return new MyRsp("1", "success");
    }
 
}

spring项目中切面及AOP的使用方法

但是,注意!这个环绕通知不是万能的,不是一定好,大家按需要使用,比如一个场景,当你的方法抛出了异常,这个环绕通知就不会再继续执行

我们来实验一下

改写controller的方法

@RestController
public class OneController {
 
    @GetMapping("/doCheck")
    public Object doCheck (int age) throws InterruptedException {
        System.out.println("这个是controller的方法 --->" + System.currentTimeMillis());
        Thread.sleep(2000l);
        System.out.println("doCheck");
        throw new MyException("1", "success");
 
//       return new MyRsp("1", "success");
    }
 
}

spring项目中切面及AOP的使用方法

看,AOP后续的没有被执行

以上就是spring的切面,AOP的使用的详细内容,更多关于spring的切面,AOP的使用的资料请关注三水点靠木其它相关文章!

Java/Android 相关文章推荐
Feign调用传输文件异常的解决
Jun 24 Java/Android
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
Jul 01 Java/Android
OpenCV实现反阈值二值化
Nov 17 Java/Android
SpringBoot2零基础到精通之数据与页面响应
Mar 22 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
Java 超详细讲解ThreadLocal类的使用
Apr 07 Java/Android
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
Apr 08 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 Java/Android
向Spring IOC 容器动态注册bean实现方式
Jul 15 Java/Android
HttpClient实现文件上传功能
Aug 14 Java/Android
HttpClient实现表单提交上传文件
Aug 14 Java/Android
Android实现获取短信验证码并自动填充
May 21 Java/Android
Java 中的 Unsafe 魔法类的作用大全
Jun 26 #Java/Android
详解Java线程池是如何重复利用空闲线程的
Jun 26 #Java/Android
Spring Data JPA的Audit功能审计数据库的变更
Spring Boot 启动、停止、重启、状态脚本
详解Java分布式事务的 6 种解决方案
Jun 26 #Java/Android
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
图解排序算法之希尔排序Java实现
You might like
基于mysql的论坛(4)
2006/10/09 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
Array对象方法参考
2006/10/03 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
haskell实现多线程服务器实例代码
2013/11/26 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
Python3获取cookie常用三种方案
2020/10/05 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
护理自荐信
2013/10/22 职场文书
财务总监管理职责范文
2014/03/09 职场文书
中学生自我评价2015
2015/03/03 职场文书
暂停营业通知
2015/04/25 职场文书
九不准学习心得体会
2016/01/23 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL