springboot笔记09——使用aop
什么是AOP?
aop(Aspect Oriented Programming)面向切面编程,是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。但是在为分散的对象引入公共行为的时候,OOP显得无能为力。OOP擅长从上到下的关系,但是不适合从左到右的关系,例如日志、权限,这些功能的代码往往是水平地分布在对象层次中,而与所在的对象的核心功能关系不大。这些代码称为“横切”代码,在OOP中,这导致了大量的代码冗余,且不利于模块间代码的重用。
AOP则擅长于切面编程,将那些影响多个类的公共行为封装到一个模块中,供其他模块重用,便于减少重复代码,降低模块间的耦合度,提高系统的可操作性和可维护性。
一些关于aop的术语
- Aspect: 切面,包含一些Pointcut和Advice
- Pointcut:切入点,相当于一个条件,只有符合条件的方法才会走Advice
- advice:通知,只有符合Pointcut的方法会执行通知,advice分为before,around,after,AfterReturning,AfterThrowing
- advice通过以下几种通知来确定在什么时候调用advice
- @before:前置通知,方法执行之前调用advice
- @around:环绕通知,方法执行前后都会调用advice
- @after:后置通知,方法执行之后调用advice(无论方法执行是否发送异常,总是调用)
- @AfterReturning:后置通知,方法执行之后调用advice,可以获取返回值 (无论方法执行是否发送异常,总是调用)
- @AfterThrowing:后置通知,方法执行中发生异常后调用,可以获取异常信息(只有发生异常才会)
springboot使用aop
创建项目,引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Aspect配置类
@Aspect
@Component
public class MyAspect {
/*
* 切入点
* */
@Pointcut("execution(public * com.jotal.springboot07aop.controller.*.*(..))")
public void execute() {
}
/*
* 前置通知
* */
@Before(value = "execute()")
public void Before(JoinPoint joinPoint) {
System.out.println("执行方法之前!");
}
/*
* 环绕通知
* */
@Around(value = "execute()")
public Object around(ProceedingJoinPoint proceedingJoinPoint){
System.out.println("环绕通知开始");
try {
System.out.println("执行方法:"+proceedingJoinPoint.getSignature().getName());
Object Object = proceedingJoinPoint.proceed();
System.out.println("环绕结束,方法返回:"+Object);
return Object;
} catch (Throwable e) {
System.out.println("执行方法异常:"+e.getClass().getName());
return null;
}
}
/*
* 后置通知
* */
@After(value = "execute()")
public void after(){
System.out.println("执行方法之后!");
}
/*
* 后置通知,带有返回值
* */
@AfterReturning(pointcut = "execute()",returning = "obj")
public void afterReturn(Object obj){
System.out.println("执行方法后获取返回值:" + obj);
}
/*
* 后置通知,异常时执行
* */
@AfterThrowing(throwing = "e",pointcut = "execute()")
public void doAfterThrowing(Exception e){
System.out.println("执行方法异常:" + e.getClass().getName());
}
}
@Aspect :标注切面类
@Component:注入spring ioc容器管理
@Pointcut("execution(public * com.jotal.springboot07aop.controller.*.*(..))"):声明切入点
"execution(public * com.jotal.springboot07aop.controller.*.*(..))":条件表达式, com.jotal.springboot07aop.controller包下的public声明的方法都会使用aop
@Before,@Around,@After,@AfterReturning,@AfterThrowing:通知类型
控制类
@RestController
public class testController {
@GetMapping("/useAop")
public String useAop(){
return "方法的返回";
}
@GetMapping("/doNotUseAop")
void doNotUseAop(){
System.out.println("doNotUseAop");
}
@GetMapping("/throw")
public void throwException(){
throw new RuntimeException();
}
}
测试
有通知
http://localhost:8080/doNotUseAop

无通知

抛出异常
springboot笔记09——使用aop的更多相关文章
- JAVA自学笔记09
JAVA自学笔记09 1.子类的方法会把父类的同名方法覆盖(重写) 2.final: 1)可修饰类.方法.变量 2)修饰类时:此时该类变为最终类,它将无法成为父类而被继承 3)修饰方法时:该方法将无法 ...
- 机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据
机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据 关键字:PCA.主成分分析.降维作者:米仓山下时间:2018-11-15机器学习实战(Ma ...
- 强化学习读书笔记 - 09 - on-policy预测的近似方法
强化学习读书笔记 - 09 - on-policy预测的近似方法 参照 Reinforcement Learning: An Introduction, Richard S. Sutton and A ...
- 【SpringBoot】SpingBoot整合AOP
https://blog.csdn.net/lmb55/article/details/82470388 [SpringBoot]SpingBoot整合AOPhttps://blog.csdn.net ...
- C++ GUI Qt4学习笔记09
C++ GUI Qt4学习笔记09 qtc++ 本章介绍Qt中的拖放 拖放是一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式.除了剪贴板提供支持外,通常它还提供数据移动和复制的功 ...
- SpringBoot应用中使用AOP记录接口访问日志
SpringBoot应用中使用AOP记录接口访问日志 本文主要讲述AOP在mall项目中的应用,通过在controller层建一个切面来实现接口访问的统一日志记录. AOP AOP为Aspect Or ...
- Java:并发笔记-09
Java:并发笔记-09 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 7. 共享模型之工具-2 原理:AQS 原理 对于 AQS 的原理这部分内容,没很好的 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- SpringBoot笔记一
1 开始 1.1 spring介绍 Spring Boot使开发独立的,产品级别的基于Spring的应用变得非常简单,你只需"just run". 我们为Spring平台及第三方库 ...
随机推荐
- ICEM-双管
原视频下载地址:http://yunpan.cn/cLHCm7Uejw4eG 访问密码 b8a1
- 牛顿插值法(c++)【转载】
摘自<c++和面向对象数值计算>,代码简洁明快,采用模板函数,通用性增强,牛顿差分合理利用存储空间,采用Horner算法(又称秦九韶算法)提高精度,减少时间复杂度,高!确实是高!对其中代码 ...
- Wireshark常用快捷键&&过滤器语法
目录 一.快捷键 二.过滤器语法 1.捕获过滤器的BPF(Berkeley Packet Filter)语法 2.显示过滤器 一.快捷键 Ctrl+M 标记/取消标记 shift+ctrl+N/B 下 ...
- arcgis python 获得硬件id
import time import wmi, zlib def get_cpu_info(): tmpdict = {} tmpdict["CpuCores"] = 0 c = ...
- uniapp - 如何申请阿里云存储
长话短说,简略表述 1. 登录阿里云,选择 oos对象云存储 https://oss.console.aliyun.com/overview 2. 新建“Bucket”,名称是唯一的(建议用公司或者个 ...
- postgresql中pg_walfile_name()
pg_walfile_name(lsn pg_lsn):将wal位置转换成文件名 pg_lsn数据类型可以用于存储LSN数据,LSN是指向WAL中某个位置的指针.pg_lsn用XLogRecPtr的形 ...
- EFProf用法
SQL Server Profiler用来跟踪应用程序发送到SQL Server中的SQL语句,用于检测性能,查找问题.Entity Framework 也有它的跟踪工具EFProf,用于跟踪Enti ...
- 元数据Meta
元数据,指的是“除了字段外的所有内容”,例如排序方式.数据库表名.人类可读的单数或者复数名等等.所有的这些都是非必须的,甚至元数据本身对模型也是非必须的. 在模型中增加元数据,需要在模型类中添加一个子 ...
- jsp 记录
前后端开发好久后,一直没怎么用前端开发了.最近任务比较急,又开始写jsp页面了... 1)jquery.validate.min.js 用法总结 https://www.cnblogs.com/x ...
- SSO CAS 单点系列
在多系统应用群中,使用,例如,用户账户管理,用户应该有一个统一的账户,不应该让用户在每个子系统分别注册 登陆再分别登出.这就是我们所说的单点登陆问题,即SSO: SSO问题,时大中型web应用经常碰到 ...
