Springboot 中AOP的使用
面向切面编程(Aspect Oriented Programming) 是软件编程思想发展到一定阶段的产物,是面向对象编程的有益补充。AOP一般适用于具有横切逻辑的场合,如访问控制、事务管理、性能检测等。
日志、异常处理、事务控制等都是一个健壮的业务系统所必须的。但是为了保证系统健壮可用,就要再众多业务方法中反复编写类似的代码,使得原本就很复杂的业务处理代码变得更加复杂。业务功能的开发者还要考两次这些额外的代码是否处理正确,是否有遗漏的地方,如果需要修改日志信息的格式或者安全验证的规则,或者再增加辅助功能,都会导致业务代码频繁而大量的修改。
面向切面编程,就是在不改变原程序的基础上为代码增加新的功能,对代码段进行增强处理。他的设计思想来源于代理设计模式。

1.在原对象方法之前插入的增强处理为前置增强
2.该方法执行完以后插入的增强处理为后置增强
3.环绕在方法前后的增强处理为环绕增强,是最强大的增强处理,可以获取或者修改目标方法的参数、返回值、异常处理、甚至决定目标方法是否执行。
4.该方法抛出异常时的增强处理为异常抛出增强
5.最终增强处理,无论方法抛出异常还是正常退出都会得到执行,类似于异常处理机制中finally块的作用,一般用于释放资源
在Springboot中使用注解
需要引入所需要的jar :spring-boot-starter-aop
创建一个aop增强处理类
@Slf4j
@Aspect
@Component
public class LoggerAspect { // 匹配 com.lzz.lzzapp.common.user包及子包下所有类的所有方法
@Pointcut("execution(* com.lzz.lzzapp.common.user..*.*(..))")
public void logPointCut(){ }
//前置增强 在连接点执行之前执行的通知
@Before("logPointCut()")
public void before(){
log.info("即将调用业务方法");
}
//最终增强 在连接点执行之后执行的通知(返回通知和异常通知的异常)
@After("logPointCut()")
public void after(){
log.info("业务方法调用完成");
} /**
* 后置增强 在连接点执行之后执行的通知(返回通知)
*/
@AfterReturning(value="logPointCut()",returning="result")
public void doAfterReturning(JoinPoint joinPoint, Object result){
String methodName = joinPoint.getSignature().getName();
log.info("调用"+joinPoint.getTarget()+"的"+methodName+"方法。参数:"+Arrays.toString(joinPoint.getArgs())
+"。方法返回值:"+result);
} /**
* 异常增强 在连接点执行之后执行的通知(异常通知)
*/
@AfterThrowing("logPointCut()")
public void doAfterThrowing(){
log.info("异常处理完成");
} /**
* 环绕增强
*/
@Around("logPointCut()")
public void doAround(ProceedingJoinPoint jp){
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。参数:"+Arrays.toString(jp.getArgs()));
try {
Object result=jp.proceed();//执行目标方法
log.info("方法返回值:"+result);
}catch (Throwable e){
log.error(jp.getSignature().getName()+"方法发生异常");
e.printStackTrace();
}
} }
使用@Aspect定义切面,@Pointcut定义切入点
切入点匹配的执行点为连接点为JointPoint,Spring会自动注入该实例,通过joinpoint 的getTarget()方法可以得到被代理对象,getSignature()方法返回被代理的目标方法。getArgs()方法返回传递给目标方法的参数数组
对于后置增强,还可以定义一个用于接收被代理方法的返回值,必须在 @AfterReturning 注解中通过returning 属性指定该参数的名称
execution是切入点指示符,他括号中是一个切入点表达式,可以配置要切入的方法,切入点表达式支持模糊匹配
public * addUser(com.entity.User) * 表示匹配所有类型的返回值
public void *(com.entity.User) * 表示匹配所有方法名
public void addUser(..) .. 表示匹配所有参数个数和类型
* com.user.*.*(..) 表示匹配com.entity包下所有类的所有方法
* com.user..*.*(..) 表示匹配com.entity包及其子包下所有类的所有方法
Springboot 中AOP的使用的更多相关文章
- Springboot的日志管理&Springboot整合Junit测试&Springboot中AOP的使用
==============Springboot的日志管理============= springboot无需引入日志的包,springboot默认已经依赖了slf4j.logback.log4j等日 ...
- SpringBoot中AOP的配置
AOP目的: 面向切面编程(aspect-oriented programming,AOP)主要实现的目的是针对业务处理过程中的切面进行提取,诸如日志.事务管理和安全这样的系统服务,从而使得业务逻辑各 ...
- SpringBoot 中aop整合方法执行日志
今天事情不多, 处理完手中的事边想着捣鼓一下AOP, 着手开始写才发现, 多久不用, 自己已经忘得差不多了, 捣鼓半天之后, 慢慢整出这个小demo,以便于以后查阅回顾 1 .先创建一个注解, 用来作 ...
- springboot中aop的使用
Spring AOP(Aspect Oriented Programming),即面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善. OOP引 ...
- Springboot中AOP统一处理请求日志
完善上面的代码: 现在把输出信息由先前的system.out.println()方式改为由日志输出(日志输出的信息更全面) 现在在日志中输出http请求的内容 在日志中获取方法返回的内容
- SpringBoot图文教程5—SpringBoot 中使用Aop
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...
- Springboot中使用AOP统一处理Web请求日志
title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...
- 在SpringBoot中配置aop
前言 aop作为spring的一个强大的功能经常被使用,aop的应用场景有很多,但是实际的应用还是需要根据实际的业务来进行实现.这里就以打印日志作为例子,在SpringBoot中配置aop 已经加入我 ...
- SpringBoot中使用LoadTimeWeaving技术实现AOP功能
目录 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 1.2 JDK实现LTW的原理 1.3 如何在Spring中实现LTW 2. Springboot中使用LTW实现A ...
随机推荐
- lnmp1.5一键安装包安装lnmpa后,添加站点
lnmp1.5一键安装包安装lnmpa后,添加站点 (1)添加站点 (2)配置apache配置文件 在/usr/local/apache/conf/vhost文件夹下,修改webApp站点配置文件ap ...
- Spring整合MyBatis案例练习笔记
需求: 用户登录 技术需求: Servlet+Spring+Mybatis+MVC+jsp+css+html+jquery 数据库设计: 用户表 Sql语句设计: select * from t_us ...
- davinci入门必读
http://www.usr.cc/forum.php/static/image/smiley/tiger/archiver/forum.php?mod=viewthread&action=p ...
- onvif学习一:wsdl 和soap
来源:https://www.cnblogs.com/huanghongbo/p/5920123.html WSDL是用来描述WebService的,它用XML的格式描述了WebService有哪些方 ...
- apache配置跨域请求代理
1.配置允许跨域请求 Header always set Access-Control-Allow-Origin "*"Header always set Access-Contr ...
- 记录 shell学习过程(1) 超简单的面向过程的2个shell 分区以及创建lvm
分区 #!/usr/bin/env bash #fdisk /dev/sdb << EOF #n # # # #+600M #w #EOF 创建lvm pvcreate /dev/sdb ...
- EF CodeFirst 一对一、一对多、多对多关系
一对一关系 如图,无需专门指定,系统会默认在Person表中生成字段Pet_Id为Pet表的外键(一对一). Require:必要的(一对一) Optional:可选的(一对零) Principa ...
- Jarvis OJ - [XMAN]level1 - Writeup
Jarvis OJ - [XMAN]level1 - Writeup M4x原创,转载请表明出处http://www.cnblogs.com/WangAoBo/p/7594173.html 题目: 分 ...
- 【模板】堆优化的dijkstra
生命算法,以防忘记 #include<bits/stdc++.h> using namespace std; int head[200005],dis[200005],n,m,s,f,g, ...
- 基于Docker的Mysql Cluster集群
参考 mysql-cluster镜像 https://medium.com/@ahmedamedy/mysql-clustering-with-docker-611dc28b8db7 使用Docker ...